最近 CodeReview 时发现,项目的历史代码中有一些,像 &、|、^、~、<<、>>、>>>
的符号, 本人不甚了解原理, 翻文档学习了一下。javascript
按位操做符 (Bitwise operators) 将其操做数(operands)当作32位的比特序列(由 0 和 1 组成)。就是说,js里对一个数据进行位运算时,会先将操做数转换成 32 位二进制数,而后按位操做符操做数字的二进制形式,最后返回一个结果,返回的值依然是标准的JavaScript数值。java
两个二进制数,它们对应位的数都是1时,结果才为1,不然为0。api
在 javascript 中, 按位与用 &
表示。例如:markdown
9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10)
复制代码
按位操做符的使用-按位与oop
两个二进制数,它们对应位的数至少有一个1时,结果为1,不然为0。post
在 javascript 中, 按位或用 |
表示。例如:学习
9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 | 9 (base 10) = 00000000000000000000000000001111 (base 2) = 15 (base 10)
复制代码
两个二进制数,它们对应位的数有且只有一个1时,结果为1,不然为0。spa
在 javascript 中, 按位异或用 ^
表示。例如:code
9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 ^ 9 (base 10) = 00000000000000000000000000000111 (base 2) = 7 (base 10)
复制代码
反转对应位的数, 若是是 1 , 结果为 0; 若是是 0, 结果为 1。
在 javascript 中, 按位非用 ~
表示。例如:
9 (base 10) = 00000000000000000000000000001001 (base 2)
--------------------------------
~9 (base 10) = 11111111111111111111111111110110 (base 2) = -10 (base 10)
复制代码
将二进制数的右第一位向左移动指定的位数,右侧用 0 补充。
在 javascript 中, 左移用 <<
表示。例如:
9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)
复制代码
将二进制数的右第一位向右移动指定的位数, 右侧移出的位放弃, 拷贝移出的最左侧位,填充给左侧移出后缺乏的位。因为新的最左侧的位老是和之前相同,最左侧的符号位没有改变。
在 javascript 中, 有符号右移用 >>
表示。例如:
9 >> 2
获得 2:
9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 >> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)
复制代码
-9 >> 2
获得 -3,由于符号被保留了。
-9 (base 10): 11111111111111111111111111110111 (base 2)
--------------------------------
-9 >> 2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)
复制代码
将二进制数的右第一位向右移动指定的位数, 右侧移出的位放弃, 左侧用 0 补充。
在 javascript 中, 无符号右移用 >>>
表示。例如:
对于正数, 9 >>> 2
和 9 >> 2
的值是同样的。
9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)
复制代码
而对于负数是不同的, 由于左侧填充了 0, 前面的负号丢失了。
-9 (base 10): 11111111111111111111111111110111 (base 2)
--------------------------------
-9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10)
复制代码
学习完了以后,我会整理一份 JavaScript 中常常用到按位操做符的经典案例。