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);
    }
    
    尝试一下