位运算符

位运算符

推荐阅读: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)