读react源码发现里边用到了大量位运算,这次来总结一下
什么是位运算
js中的与运算
- 符号为:&,写法为:表达式1 & 表达式2
- 两位同时为“1”,结果才为“1”,否则为0
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
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
- 在计算机中负数就是存储的补码 符号位不变
- 正数在计算机中,原反补码相同
真码:=> 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 => 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
js中的异或运算
- 符号:^ ,写法:数字1 ^ 数字2
- 将数字1和数字2按32位二进制进行比较,不同为1,相同为0
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 => 0000 0000 0000 0000 0000 0000 0000 0011
=> 0000 0000 0000 0000 0000 0000 0000 0110
转为10进制后为6
- 右位移
- 符号: >>,写法:数字1 >> 数字2
- 将数字1的二进制位(除符号外),右位移数字2的次数
3 => 0000 0000 0000 0000 0000 0000 0000 0011
=> 0000 0000 0000 0000 0000 0000 0000 0001
转为10进制后为1
- 带符号右移
- 符号:>>>,数字1 <<< 数字2
- 同右位移,区别在于,符号位会跟着移动
-1 => 1111 1111 1111 1111 1111 1111 1111 1110
=> 0111 1111 1111 1111 1111 1111 1111 1111
转为为二进制为2147483647