XOR(exclusive OR): exclusive 意思是“专有的,独有的”,XOR可以理解为更单纯的OR运算。
真值表
真值表比较好记了:都是围绕1计算的。
| : 两个位都是1,则1,否则0
& : 只要有一位为1,则1,否则0
^ : 一位为1,另一位为0,则为1,否则为0
位操作时,整形如何转成二进制
JavaScript stores numbers as 64 bits floating point numbers, but all bitwise operations are performed on 32 bits binary numbers. Before a bitwise operation is performed, JavaScript converts numbers to 32 bits signed integers. After the bitwise operation is performed, the result is converted back to 64 bits JavaScript numbers.
翻译:
JavaScript将数字存储为64位浮点数,但所有按位操作都是对32位二进制数执行。
在执行逐位操作之前,JavaScript将数字转换为32位有符号整数。
执行逐位运算后,结果将转换回64位JavaScript数字。
因此移动的位数最长32位,超过32,则取模32。
127 >> 1 = 63
127 >> 33 = 63 // 33 % 32
// 移1位和33位 结构时一样的
移位
移位运算是将数值向左向右移动,对于十进制来说就是实现放大十倍和缩小十倍的效果,而对于二进制而言就是放大两倍和缩小两倍的效果。
左移(<<)
规则
所有的二进制位整体左移要移动的位数,高位移出(舍弃),低位的空位补零。
数学意义
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
为什么左移不区分有无符号位?
应用场景
将2个八位的数字(x,y)拼接成一个16位的数字(z)
z = x << 8 + y
右移/算术右移(>>)
规则:
所有的二进制位整体右移要移动的位数,低位移出(舍弃),高位的空位补符号位(符号扩展),即正数补零,负数补1。
示例
int x;
x = (-7 >> 2);
// -7的二进制数1111 1111 1111 1111 1111 1111 11111001右移两位,
// 因为是负数,所以空位由1补充,变成1111 1111 1111 1111 1111 1111 11111110
// 结果 x = -2
数字意义
无符号右移/逻辑右移(>>>)
规则:
所有的二进制位整体右移(包括符号位)要移动的位数,高位移出(舍弃),高位的空位补零(0扩展)。