在排序时,为什么按位移位的行为会有所不同?

时间:2016-08-28 10:18:50

标签: javascript bitwise-operators bit-shift

为什么按位左移有不同的结果?

1 << 32;        # 1
1 << 31 << 1;   # 0

3 个答案:

答案 0 :(得分:1)

那是因为

  

shiftCount成为屏蔽除rnum的最低5位之外的所有内容的结果,即计算rnum & 0x1F

如何定义<<操作。见http://www.ecma-international.org/ecma-262/6.0/#sec-left-shift-operator-runtime-semantics-evaluation

因此根据它 - 32 & 0x1F等于0

所以1 << 32等于1 << 0所以基本上没有操作。

而连续2次移位31次和1次字面意义执行计算

答案 1 :(得分:0)

JavaScript将左移定义为32,什么都不做,大概是因为它击中了32位边界。实际上你不能移动任何超过31位的东西。

你首先移动31位,然后是最后一位的方法,围绕着JavaScript的思考,认为转移太多没有意义。实际上,当您首先编写= 0时,执行这些计算毫无意义。

答案 2 :(得分:0)

原因是移位计数被视为模32。

这本身就是因为(我的猜测)这就是今天台式机/笔记本电脑最常用的硬件(x86)。

这本身就是因为......好吧,只是因为。

这些转变限制确实在某些情况下令人讨厌......例如,我的选择中只有一个班次操作员会更好,根据计数的符号在两个方向上工作(如ASH适用于Common Lisp)。