为什么按位左移有不同的结果?
1 << 32; # 1
1 << 31 << 1; # 0
答案 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)。