ECMAScript 老生常谈(总结) 二、运算符篇

224 阅读3分钟

位运算符

整数

ECMAScript整数有两种类型,即有符号整数(允许用正数和负数)无符号整数(只允许用正数)

有符号整数

正有符号整数

有符号整数第32位为符号位,例如1

例如 7

负有符号整数

这里推荐看原文

第32位0表示正,1表示负

图中红字应为32,我数过了。

位运算 NOT

NOT符号为 ~

操作如同b = -a - 1,实际上是求了反码。

位运算 AND

AND符号 &

例如

这是因为

位运算 OR

OR符号 |

##位运算 XOR XOR符号 ^

这三种运算分别有不同的计算逻辑,但是计算过程相似。

左移运算

符号 <<

查阅了很多资料后我只能说一下自己的见解,最后我会附带传送门

如图

可见第三十二位符号位在左移运算中在移动后保留原数值

这是什么意思呢?

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

按照上面说的,符号位保留原数值,那为什么1左移31位不应该是正的2147483648吗?

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

那么2147483648本就是溢出的值,所以才会出现问题。

负数左移

如果是负数左移,例如 -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的三十二次方,这个正数能不大吗!

出于这种原因,使用无符号右移运算符要小心。