壹.2.11 位操作符与进制转换
为什么单独讲“位操作符”呢?因为我发现日常工作中,前端工程师朋友们经常使用算术操作符、一元操作符、关系操作符、相等操作符,就是很少有用到位操作符(|,&,~,^,<<,>>)。但其实位操作符用好了又特别省事,一般的老手都会用它来实现一些特定功能,因此也会被经常问到来侧面考察一个前端工程师是否老到。所以,这里单独用一篇文章来系统性讲解位操作符。
基础讲解
按位与(&)
两个操作数中相对应的位都是1时,这位为1,否则都为零
按位或(|)
如果两个数对应的有一个为1时,这位就为1
按位异或(^)
两个数对应位不同,这位才为1,否则为0
按位非(~)
一元操作符。将操作数所有位取反。而根据js中带符号的整数的表示方法,对一个值使用~运算符相当于它的相反数减1。
左移(<<)
将第一个操作数进行左移,移动的位数为第二个操作数(0~31之间的一个整数),新的位由0补齐。
有符号右移(>>)
将第一个操作数进行右移,移动的位数为第二个操作数(0~31之间的一个整数),右边的溢出位被忽略,填补在左边的位由原操作数符号决定,以便保持结果的符号与原操作数一致。如果第一个操作数是正数,移位后用0填补最高位;如果为负,用1填补最高位。
无符号右移
同样右移,最高位补0,忽略符号位
进制转换
位操作涉及与二进制的转换,这里顺带把JavaScript的进制转换也讲一下。
1.十进制转其他
十进制转其他相对简单,直接使用 toString() 方法。
2.其他转十进制
其他进制转十进制也比较简单,使用parseInt,传递第二个参数代表当前数字的进制。
3.其他进制转其他进制
这里需要转换两次,首先使用parseInt转换到十进制,然后使用toString转换到目标进制。
另外,可以参考这篇文章,用笔和纸手算二进制与十进制转换。
面试题
华为面试题:判断两个IP是否在同一子网
子网掩码是用来判断任意两台计算机的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.00000000
AND运算 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.00000000
AND运算 **11000000.10101000.00000000.00000000
转化为十进制后为: 192.168.0.0
通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
最后更新于