按位操作符
按位操作符是将操作数当做32为的比特序列(0和1组成),按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值.
运算符 | 用法 | 描述 |
---|---|---|
按位与( AND) | a & b |
对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。 |
按位或(OR) |
a I b
|
对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0。 |
按位异或(XOR) | a ^ b |
对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。 |
按位非(NOT) | ~ a |
反转操作数的比特位,即0变成1,1变成0。 |
左移 | a << b |
将 a 的二进制形式向左移 b (< 32) 比特位,右边用0填充。 |
有符号右移 | a >> b |
将 a 的二进制表示向右移b (< 32) 位,丢弃被移出的位。 |
无符号右移 | a >>> b |
将 a 的二进制表示向右移b (< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。 |
有符号的32位整数
所有的按位操作符都会被转成补码形式的有符号的32位整数
.补码形式是指一个数的负对应值
为数值的所有比特位反转后再加1
.反转比特位即该数值进行"非"位运算,也即该数值的反码.
314的二进制编码
00000000000000000000000100111010
下面编码~314
,即314
的反码
11111111111111111111111011000101
最后,下面编码 -314,即 314 的补码(反转后+1):
11111111111111111111111011000110
补码保证了当一个数是正数时,其最左的比特位是0,当一个数是负数时,其最左的比特位是1。因此,最左边的比特位被称为符号位(sign bit)。
0
是所有比特位都由数字0组成的整数
0 (base 10) = 00000000000000000000000000000000 (base 2)
-1
是所有比特位都由数字1组成的整数
-1 (base 10) = 11111111111111111111111111111111 (base 2)
-2147483648
(十六进制形式:-0x80000000)是除了最左边为1外,其他比特位都为0的整数。
-2147483648 (base 10) = 10000000000000000000000000000000 (base 2)
2147483647
(十六进制形式:0x7fffffff)是除了最左边为0外,其他比特位都为1的整数。
2147483647 (base 10) = 01111111111111111111111111111111 (base 2)
按位逻辑操作符
从概念上讲,按位逻辑操作符遵循下面规则:
- 操作数被转换成32位整数,用比特序列(0和1组成)表示,超过32的数字会被丢弃.
转换前: 11100110111110100000000000000110000000000001
转换后: 10100000000000000110000000000001
- 第一个操作数的每个比特位与第二个操作数的相应比特位匹配:第一位对应第一位,第二位对应第二位,以此类推.
- 位运算符应用到每对比特位,结果是新的比特值.
&按位与
对每对比特位执行与操作.只有a和b都是1时,a AND b才是1,否则为0.
如下:
a | b | a AND b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10)
将任一数值 x 与 0 执行按位与操作,其结果都为 0。将任一数值 x 与 -1 执行按位与操作,其结果都为 x.
|按位或
对每一对比特位执行或操作,如果a或b中至少一个为1,结果为1,否则为0.
a | b | a OR b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 & 9 (base 10) = 00000000000000000000000000001111 (base 2) = 15(base 10)
将任一数值 x 与 0 进行按位或操作,其结果都是 x。将任一数值 x 与 -1 进行按位或操作,其结果都为 -1。