位运算符
推荐阅读:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
<< 左移
二进制数左移n位, 就等价于乘以2^n。
例如:14 << 2的值为56(可以算成14*2^2)
>> 右移
二进制数右移n位, 就等价于除以2^n。
例如:16 >> 2的值为4 (可以算成16 / 2^2)
>>> 无符号右移
先把符号位置0,然后二进制数右移n位。
原来 js 的 number 类型是 64 位浮点数,在执行位运算的时候,js 会把 number 转成 32 位带符号位二进制数
就是说超过 2^32-1 的部分会被忽略,因此产生 2**32 >>> 0 === 0 的结果
而在执行无符号位右移的时候,会把符号位置为0,因此产生 -1 >>> 0 === 2^32 - 1 的结果
~ 按位 否
二进制数全部取反,包括符号位。
所以 ~1 === -2
我们知道数字都以补码形式存在:
原码 反码 补码
1 : 000...001 ----> 000...001 -----> 000...001
-2 : 100...010 ----> 111...101 -----> 111...110
~1 就是1的补码全部取反,111...110 和 -2 的补码一致
按位否等价于 十进制取反,再减1,例如 :~233 === -234
& 按位与
0 & 0=0; 0 & 1=0; 1 & 0=0; 1 & 1=1
| 按位或
0 & 0=0; 0 & 1=1; 1 & 0=1; 1 & 1=1
^ 异或
0^0=0; 0^1=1; 1^0=1; 1^1=0;
同或
js和大部分语言一样,没有同或。但是,众所周知,异或是同或的取反。
所以我们可以用 按位否 + 异或 来表示同或,例如:~(16^8)