JavaScript 按位运算
-
JavaScript按位运算符
操作符 名称 描述 & 按位与 如果两个位均为1,则将每个位设置为1 | 按位或 如果两位中的一位为1,则将每个位设置为1 ^ 按位异或 如果两个位中只有一个为1,则将每个位设置为1 ~ 非 反转所有位 << 零填充左移 通过从右侧推入零来左移,让最左边的位掉下来 >> 算术右移 通过从左侧推入最左边的位的副本来向右移动,并使最右边的位脱落 >>> 零填充右移 通过从左侧推入零来向右移动,并让最右边的位脱落 例子:操作 结果 等价 结果 5 & 1 1 0101 & 0001 0001 5 | 1 5 0101 | 0001 0101 ~ 5 10 ~0101 1010 5 << 1 10 0101 << 1 1010 5 ^ 1 4 0101 ^ 0001 0100 5 >> 1 2 0101 >> 1 0010 5 >>> 1 2 0101 >>> 1 0010 -
JavaScript使用32位按位操作数
JavaScript将数字存储为64位浮点数,但所有按位运算都是在32位二进制数上执行的。在执行按位操作之前,JavaScript将数字转换为32位有符号整数。执行按位操作后,结果将转换回64位JavaScript数字。上面的例子使用4位无符号二进制数。因为这~ 5返回10。由于JavaScript使用32位有符号整数,因此它不会返回10.它将返回-6。00000000000000000000000000000101(5)11111111111111111111111111111010(~5 = -6)带符号整数使用最左边的位作为符号位。
-
按位与
当对一对位执行按位与操作时,如果两个位都为1,则返回1。一位操作例子:操作 结果 0&0 0 0&1 0 1&0 0 1&1 1 四位操作例子:操作 结果 1111&0000 0000 1111&0001 0001 1111&0010 0010 1111&0100 0100 -
按位或
当对一对位执行按位或操作时,如果其中至少有一个位为1,则返回1,否则返回0:一位操作例子:操作 结果 0|0 0 0|1 1 1|0 1 1|1 1 四位操作例子:操作 结果 1111|0000 1111 1111|0001 1111 1111|0010 1111 1111|0100 1111 -
按位异或
当对一对位执行按位异或操作时,如果位不同(相异而或),则返回1:一位操作例子:操作 结果 0^0 0 0^1 1 1^0 1 1^1 0 四位操作例子:操作 结果 1111^0000 1111 1111^0001 1110 1111^0010 1101 1111^0100 1011 -
JavaScript按位与(&)
仅当两个位都为1时,按位与才返回1:十进制 二进制 5 00000000000000000000000000000101 1 00000000000000000000000000000001 5 & 1 00000000000000000000000000000001 (1)
尝试一下var x = 5 & 1;
-
JavaScript按位或(|)
仅当两个位都为1时,按位与才返回1:十进制 二进制 5 00000000000000000000000000000101 1 00000000000000000000000000000001 5 | 1 00000000000000000000000000000101 (5)
尝试一下var x = 5 | 1;
-
JavaScript按位异或(^)
如果位不同,则按位异或返回1:十进制 二进制 5 00000000000000000000000000000101 1 00000000000000000000000000000001 5 ^ 1 00000000000000000000000000000100 (4)
尝试一下var x = 5 | 1;
-
JavaScript按位非(~)
十进制 二进制 5 00000000000000000000000000000101 ~5 11111111111111111111111111111010(-6)
尝试一下var x = ~5;
-
JavaScript(零填充)按位左移(<<)
这是零填充左移。从右侧推入一个或多个零位,最左边的位丢失:十进制 二进制 5 00000000000000000000000000000101 5 << 1 00000000000000000000000000001010(10)
尝试一下var x = 5 << 1;
-
JavaScript(符号保留)按位右移(>>)
这是保持正确转变的标志。最左边的位的副本从左侧推入,最右边的位数下降:十进制 二进制 -5 11111111111111111111111111111011 -5 >> 1 11111111111111111111111111111101(-3)
尝试一下var x = -5 >> 1;
-
JavaScript(零填充)右移(>>>)
这是零填充右移。从左侧推入一个或多个零位,最右侧的位丢失:十进制 二进制 5 00000000000000000000000000000101 5 >>> 1 00000000000000000000000000000010(2)
尝试一下var x = -5 >> 1;
-
二进制数
只有一位设置的二进制数很容易理解:十进制 二进制 00000000000000000000000000000001 1 00000000000000000000000000000010 2 00000000000000000000000000000100 4 00000000000000000000000000001000 8 00000000000000000000000000010000 16 00000000000000000000000000100000 32 00000000000000000000000001000000 64 再设置一些比特位显示二进制模式:十进制 二进制 00000000000000000000000000000101 5(4 + 1) 00000000000000000000000000001101 13(8 + 4 + 1) 00000000000000000000000000101101 45(32 + 8 + 4 + 1) JavaScript二进制数以二进制补码格式存储。这意味着负数是数字加1的按位非:十进制 二进制 00000000000000000000000000000101 5 11111111111111111111111111111011 -5 00000000000000000000000000000110 6 11111111111111111111111111111010 -6 00000000000000000000000000101000 40 11111111111111111111111111011000 -40 -
将十进制转换为二进制
尝试一下function dec2bin(dec){ return (dec >>> 0).toString(2); }
-
将二进制转换为十进制
尝试一下function bin2dec(bin){ return parseInt(bin, 2).toString(10); }