JavaScript位运算符
运算符 | 名称 | 描述 |
---|---|---|
& | and | 如果对应两位都是 1,则结果每位为 1 |
| | or | 如果对应两位有一个为1,则设置每位为 1 |
^ | xor | 对应两位相反相反则置结果为1(即仅有一个1才为1) |
~ | not | 反转所有位 |
<< | 零填充左移位 | 通过从右推入0向左位移,并使最左边的位脱落。 |
>> | 有符号右移位 | 通过从左推入最左位的拷贝来向右位移,并使最右边的位脱落。 |
>>> | 零填充右位移 | 通过从左推入0来向右位移,并使最右边的位脱落。 |
实例
操作 | 结果 | 相当于 | 结果 |
---|---|---|---|
5&1 | 1 | 0101 & 0001 | 0001 |
5|1 | 5 | 0101 | 0001 | 0101 |
5^1 | 4 | 0101 ^ 0001 | 0100 |
~5 | 10 | ~0101 | 1010 |
5<<1 | 10 | 0101 << 1 | 1010 |
5 >>> 1 | 2 | 0101 >>> 1 | 0010 |
5 >> 1 | 2 | 0101 >> 1 | 0010 |
JavaScript使用32位按位运算数
JS将数字存储为64位浮点数,但所有的按位运算都以32位二进制数执行。在执行位运算之前,JS将数字转换为32位有符号整数,执行按位操作后,将结果转换为64位JavaScript数。
上面例子使用4位无符号二进制数,所以~5返回10;由于JS使用32位有符号整数,因此JS将返回-6。(有符号整数使用最左边的位作为负号。)
取反是二进制操作,在计算机中,有符号整数按补码操作,补码=反码+1
以5为例:
原码:0000 0000 0000 0000 0000 0000 0000 0101
取反后:1111 1111 1111 1111 1111 1111 1111 1010
所以~5反码为:1000 0000 0000 0000 0000 0000 0000 0101
补码:1000 0000 0000 0000 0000 0000 0000 0110
最高位代表符号位,1为负数,0为正数,因此结果是-6
JS位运算符AND(&)(对应位都为1结果才为1)
十进制 | 二进制 |
---|---|
5 | 0000 0000 0000 0000 0000 0000 0000 0101 |
1 | 0000 0000 0000 0000 0000 0000 0000 0001 |
5&1 | 0000 0000 0000 0000 0000 0000 0000 0001(1) |
JS位运算符OR(|)(对应位有一个为1结果就为1)
十进制 | 二进制 |
---|---|
5 | 0000 0000 0000 0000 0000 0000 0000 0101 |
1 | 0000 0000 0000 0000 0000 0000 0000 0001 |
5 | 1 | 0000 0000 0000 0000 0000 0000 0000 0101(5) |
JS位运算符XOR(^)(对应位相反结果为1)
十进制 | 二进制 |
---|---|
5 | 0000 0000 0000 0000 0000 0000 0000 0101 |
1 | 0000 0000 0000 0000 0000 0000 0000 0001 |
5 ^ 1 | 0000 0000 0000 0000 0000 0000 0000 0100(4) |
JS位运算符NOT(~)(按位取反)
十进制 | 二进制 |
---|---|
5 | 0000 0000 0000 0000 0000 0000 0000 0101 |
~5 | 1000 0000 0000 0000 0000 0000 0000 0110(-6) |
JS(零填充)位运算左移(<<)(右边入0向左移位)
十进制 | 二进制 |
---|---|
5 | 0000 0000 0000 0000 0000 0000 0000 0101 |
5 << 1 | 0000 0000 0000 0000 0000 0000 0000 1010(10) |
JS(有符号)位运算右移(>>)(左边入最左位的拷贝值向右移位)
十进制 | 二进制 |
---|---|
-5 | 1111 1111 1111 1111 1111 1111 1111 1011(5的补码) |
-5 >> 1 | 1111 1111 1111 1111 1111 1111 1111 1101(-3,该二进制减1,再除符号位各位取反) |
JS(零填充)位运算右移(>>>)(左边入0向右移位)
十进制 | 二进制 |
---|---|
5 | 0000 0000 0000 0000 0000 0000 0000 0101 |
5 >>> 1 | 0000 0000 0000 0000 0000 0000 0000 0010(3) |