javaScript中的位运算

126 阅读4分钟

读react源码发现里边用到了大量位运算,这次来总结一下

什么是位运算

  • 位运算就是将一个整数转为二进制格式进行运算

js中的与运算

  • 符号为:&,写法为:表达式1 & 表达式2
  • 两位同时为“1”,结果才为“1”,否则为0
// 2 & 3 
2 => 0000 0000 0000 0000 0000 0000 0000 0010
3 => 0000 0000 0000 0000 0000 0000 0000 0011
                                        0010
  => 0000 0000 0000 0000 0000 0000 0000 0010
转为十进制为2

js中的或运算

  • 符号 | ,写法:表达式1 | 表达式2
  • 两位同时为“0”,结果才为0,其余情况全为1
// 2 | 3
 1 => 0000 0000 0000 0000 0000 0000 0000 0010
 3 => 0000 0000 0000 0000 0000 0000 0000 0011
                                         0011
   => 0000 0000 0000 0000 0000 0000 0000 0011
转为十进制为3

JS中的否(非)运算

  • 符号为:~,写法:~表达式
  • 按位取反 0变成1,1变成0
  • 在计算机中负数就是存储的补码 符号位不变
  • 正数在计算机中,原反补码相同
// -1
真码:=> 1000 0000 0000 0000 0000 0000 0000 0001
反码:=> 1111 1111 1111 1111 1111 1111 1111 1110
补码:=> 1111 1111 1111 1111 1111 1111 1111 1111
那么-1在计算机存储的就是补码:1111 1111 1111 1111 1111 1111 1111 1111

~1等于多少(~1的十进制)?
// ~1
1  => 0000 0000 0000 0000 0000 0000 0000 0001
-1 => 1111 1111 1111 1111 1111 1111 1111 1110(补码)
   => 1111 1111 1111 1111 1111 1111 1111 1101(反码 = 补码 - 1)
   => 1000 0000 0000 0000 0000 0000 0000 0010(真码)
转为十进制是2
 ~x:-x - 1 // 取反某个数字,先让这个数字变成负数,然后减去1,就得到非运算结

js中的异或运算

  • 符号:^ ,写法:数字1 ^ 数字2
  • 将数字1和数字2按32位二进制进行比较,不同为1,相同为0
// 2 ^ 3
2 => 0000 0000 0000 0000 0000 0000 0000 0010
3 => 0000 0000 0000 0000 0000 0000 0000 0011
                                        0001
  => 0000 0000 0000 0000 0000 0000 0000 0001
转为十进制是1

js中的位移运算

  • 左位移
  • 符号:<<,写法:数字1  <<  数字2
  • 将数字1的二进制位(除符号外),左位移数字2的次数
// 3 << 2
3 => 0000 0000 0000 0000 0000 0000 0000 0011
  => 0000 0000 0000 0000 0000 0000 0000 0110
  转为10进制后为6
  • 右位移
  • 符号: >>,写法:数字1  >> 数字2
  • 将数字1的二进制位(除符号外),右位移数字2的次数
// 3 >> 1
3 => 0000 0000 0000 0000 0000 0000 0000 0011
  => 0000 0000 0000 0000 0000 0000 0000 0001
  转为10进制后为1
  • 带符号右移
  • 符号:>>>,数字1  <<<  数字2
  • 同右位移,区别在于,符号位会跟着移动
// -1 >>> 1
-1 => 1111 1111 1111 1111 1111 1111 1111 1110
   => 0111 1111 1111 1111 1111 1111 1111 1111
   转为为二进制为2147483647