前言
最近 CodeReview 时发现,项目的历史代码中有一些,像 &、|、^、~、<<、>>、>>> 的符号, 本人不甚了解原理, 翻文档学习了一下。
按位操作符 (Bitwise operators) 将其操作数(operands)当做32位的比特序列(由 0 和 1 组成)。就是说,js里对一个数据进行位运算时,会先将操作数转换成 32 位二进制数,然后按位操作符操作数字的二进制形式,最后返回一个结果,返回的值依然是标准的JavaScript数值。
按位与( AND)
两个二进制数,它们对应位的数都是1时,结果才为1,否则为0。
在 javascript 中, 按位与用 &表示。例如:
9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10)
按位或(OR)
两个二进制数,它们对应位的数至少有一个1时,结果为1,否则为0。
在 javascript 中, 按位或用 |表示。例如:
9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 | 9 (base 10) = 00000000000000000000000000001111 (base 2) = 15 (base 10)
按位异或(XOR)
两个二进制数,它们对应位的数有且只有一个1时,结果为1,否则为0。
在 javascript 中, 按位异或用 ^表示。例如:
9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 ^ 9 (base 10) = 00000000000000000000000000000111 (base 2) = 7 (base 10)
按位非(NOT)
反转对应位的数, 如果是 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 中经常用到按位操作符的经典案例。