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。

  1. 127 >> 1 = 63
  2. 127 >> 33 = 63 // 33 % 32
  3. // 移1位和33位 结构时一样的

移位

移位运算是将数值向左向右移动,对于十进制来说就是实现放大十倍和缩小十倍的效果,而对于二进制而言就是放大两倍和缩小两倍的效果。

左移(<<)

规则

所有的二进制位整体左移要移动的位数,高位移出(舍弃),低位的空位补零。

数学意义

数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

为什么左移不区分有无符号位?

应用场景

将2个八位的数字(x,y)拼接成一个16位的数字(z)

z = x << 8 + y

右移/算术右移(>>)

规则:

所有的二进制位整体右移要移动的位数,低位移出(舍弃),高位的空位补符号位(符号扩展),即正数补零,负数补1。

示例

  1. int x;
  2. x = (-7 >> 2);
  3. // -7的二进制数1111 1111 1111 1111 1111 1111 11111001右移两位,
  4. // 因为是负数,所以空位由1补充,变成1111 1111 1111 1111 1111 1111 11111110
  5. // 结果 x = -2

数字意义

右移一位相当于除2,右移n位相当于除以2的n次方取整。

无符号右移/逻辑右移(>>>)

规则:

所有的二进制位整体右移(包括符号位)要移动的位数,高位移出(舍弃),高位的空位补零(0扩展)。

算术右移和逻辑右移的区别

算术右移是符号扩展,逻辑右移是零扩展

参考

https://www.w3schools.com/js/js_bitwise.aspx