我在 Javascript 中注意到的一件事 -
一个
Returns 0 when a = even.
Returns -2147483648 when a = odd.
同样,当-1
更改为其他一些-ve
数字。
有人可以解释一下幕后发生了什么位操作吗?或者行为未定义?
Thanks
EDIT
也不应该进行零填充右移,即-2 >>> 1
return 7
?
-2 = 1110。右移并补零后,应该给出 0111 = 7
but
a = -2; console.log(a >>> 1);
回报2147483647
我也想知道我是如何来到这里的。我做了一些研究并弄清楚了这种行为。本质上JavaScript将操作数和移位值视为位序列而不是数字。它适用于 32 位整数(浮点数被截断),最大移位为 32 位。如果我们移位的数字大于 32,所有位都会移出,结果为零。为了确保移位小于或等于 32,JavaScript 会截断 5 个最低有效位 [a << (b&0x1F)
] 或可能使用模数法 [a << (b%32)
] 产生相同的结果。
排除了这一点,将要移动的负数视为一个位序列,而不是负数(即-1)。在这种情况下b = -1 = 0xFFFFFFFF
。由于该数字大于 32,因此被截断0xFFFFFFFF & 0x1F = 31
or 0xFFFFFFFF % 32 = 31
.
因此,在您的示例中,“a”从最低有效位一直移位到最高有效位(符号位)。因此移位的结果是0x00000000
or (0x80000000 = -2147483648
)取决于操作数是否设置了 1 位(奇数或偶数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)