有人可以详细解释为什么(-3>>0).toString(2)
不会以二进制形式3
返回11111111111111111111111111111101
的两个补码,而(-3>>>0).toString(2)
会返回呢?
两者都使用位移,但前者使用Sign-propagating right shift
,后者使用Zero-fill right shift
。我找到了这个解释:
-3>>> 0(右逻辑移位)将其参数强制转换为无符号整数,这就是为什么你得到32位二进制补码的原因 表示-3。
但我不知道该怎么做。如果可能,请提供详尽的答案。
答案 0 :(得分:0)
似乎>>在按位运算超过绝对值时,只需使用相同的符号:
var absValue = Math.abs(value),
sign = value / absValue;
value = sign * (Math.abs(value) >> base);
因此,正/负值没有区别,它们是平等运作但保存了它们的标志。
而>>>仅通过将值视为无符号但不实际转换它来运行全值(包括负值的补码形式)。