位运算符
整数
ECMAScript整数有两种类型,即有符号整数(允许用正数和负数) 和 无符号整数(只允许用正数)。
有符号整数
正有符号整数
有符号整数第32位为符号位,例如1


负有符号整数
这里推荐看原文



位运算 NOT
NOT符号为 ~


位运算 AND
AND符号 &



位运算 OR
OR符号 |


左移运算
符号 <<
查阅了很多资料后我只能说一下自己的见解,最后我会附带传送门


可见第三十二位符号位在左移运算中在移动后保留原数值
这是什么意思呢?
注意:左移运算保留数字的符号位。例如,如果把-2左移5位,得到的是-64,而不是64。“符号仍然存储在第32位中吗?”是的,不过这在ECMAScript后台进行,开发者不能直接访问第32个数位。即使输出二进制字符串形式的负数,显示的也是负号形式(例如,-2将显示-10。)

因为第三十二位是符号位,三十一位的最大数值应该是2147483647也就是



负数左移
如果是负数左移,例如 -3 << 2

0 000 0000 0000 0000 0000 0000 0000 0011
反码
1 111 1111 1111 1111 1111 1111 1111 1100
+1
1 111 1111 1111 1111 1111 1111 1111 1101
左移两位
1 111 1111 1111 1111 1111 1111 11 1101 00
-1
1 111 1111 1111 1111 1111 1111 11 1100 11
反码
0 000 0000 0000 0000 0000 0000 0000 1100
保留原第三十二位符号位
结果为: 1000 0000 0000 0000 0000 0000 0000 1100
即-12
有符号右移
符号 >>
总结来说有符号右移如同左移
如图



无符号右移
符号 >>>
正数无符号右移同有符号右移。
负数无符号右移
由于无符号右移运算的结果是一个32位的正数,所以负数的无符号右移运算得到的总是一个非常大的数字。 例如


1111 1111 1111 1111 1111 1111 1111 1111这样子
当第三十二位符号位的1 从负数的概念变成2的三十二次方,这个正数能不大吗!
出于这种原因,使用无符号右移运算符要小心。