为什么单独讲“位操作符”呢?因为我发现日常工作中,前端工程师朋友们经常使用算术操作符、一元操作符、关系操作符、相等操作符,就是很少有用到位操作符(|,&,~,^,<<,>>)。但其实位操作符用好了又特别省事,一般的老手都会用它来实现一些特定功能,因此也会被经常问到来侧面考察一个前端工程师是否老到。所以,这里单独用一篇文章来系统性讲解位操作符。
两个操作数中相对应的位都是1时,这位为1,否则都为零
var a=3//011
var b=7//111
console.log(a&b)// 输出3 => 011
如果两个数对应为都不为0,这位才是1
var a=3//011
var b=7//111
console.log(a|b)// 输出7 => 111
两个数对应位不同,这位才为1,否则为0
var a=3//011
var b=7//111
console.log(a^b)// 输出4 => 100
一元操作符。将操作数所有位取反。而根据js中带符号的整数的表示方法,对一个值使用~运算符相当于它的相反数减1。
var b=-7
console.log(~b)//输出6
将第一个操作数进行左移,移动的位数为第二个操作数(0~31之间的一个整数),新的位由0补齐。
var a=3
var b=7//000111
console.log(b<<a)//111000 => 输出56
将第一个操作数进行右移,移动的位数为第二个操作数(0~31之间的一个整数),右边的溢出位被忽略,填补在左边的位由原操作数符号决定,以便保持结果的符号与原操作数一致。如果第一个操作数是正数,移位后用0填补最高位;如果为负,用1填补最高位。
var a=2
var b=-7//1 111111001
console.log(b>>a)//1 11111110 => -2
同样右移,最高位补0,忽略符号位
var a=4
var b=-1// 1 11111111
console.log(b>>>a)//0 0000 1111 1111 1111 1111 1111 1111 1111 => 输出268435455
位操作涉及与二进制的转换,这里顺带把JavaScript的进制转换也讲一下。
十进制转其他相对简单,直接使用 toString() 方法。
//十进制转其他
var x=110;
alert(x);
alert(x.toString(2));//转二进制
alert(x.toString(8));//转八进制
alert(x.toString(16));//转十六进制
其他进制转十进制也比较简单,使用parseInt,传递第二个参数代表当前数字的进制。
//其他转十进制
var x='110';
alert(parseInt(x,2)); //二进制转十进制
alert(parseInt(x,8)); //八进制转十进制
alert(parseInt(x,16));//十六进制转十进制
这里需要转换两次,首先使用parseInt转换到十进制,然后使用toString转换到目标进制。
//其他转其他
//先用parseInt转成十进制再用toString转到目标进制
alert(String.fromCharCode(parseInt(141,8)))
alert(parseInt('ff',16).toString(2));
另外,可以参考这篇文章,用笔和纸手算二进制与十进制转换。
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。I P 地址 192.168.0.1
子网掩码 255.255.255.0转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000AND运算 11000000.10101000.00000000.00000000
转化为十进制后为: 192.168.0.0
I P 地址 192.168.0.254
子网掩码 255.255.255.0转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000AND运算 ****11000000.10101000.00000000.00000000
转化为十进制后为: 192.168.0.0
通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
//todo