带你认识按位操做符

前言

最近 CodeReview 时发现,项目的历史代码中有一些,像 &、|、^、~、<<、>>、>>> 的符号, 本人不甚了解原理, 翻文档学习了一下。javascript

按位操做符 (Bitwise operators) 将其操做数(operands)当作32位的比特序列(由 0 和 1 组成)。就是说,js里对一个数据进行位运算时,会先将操做数转换成 32 位二进制数,而后按位操做符操做数字的二进制形式,最后返回一个结果,返回的值依然是标准的JavaScript数值。java

按位与( AND)

两个二进制数,它们对应位的数都是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

按位或(OR)

两个二进制数,它们对应位的数至少有一个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)
复制代码

按位异或(XOR)

两个二进制数,它们对应位的数有且只有一个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)
复制代码

按位操做符的使用-按位异或orm

按位非(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 >>> 29 >> 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 中常常用到按位操做符的经典案例。

参考

相关文章
相关标签/搜索