为什么按顺序移位时的行为不同?
Why bitwise shift acts differently when sequenced?
为什么按位左移会有不同的结果?
1 << 32; # 1
1 << 31 << 1; # 0
那是因为
Let shiftCount
be the result of masking out all but the least significant 5 bits of rnum
, that is, compute 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 字面上执行计算
JavaScript 定义左移 32 位不做任何事情,大概是因为它撞到了 32 位边界。你实际上不能移动超过 31 位的任何东西。
您首先移动 31 位,然后移动最后一位的方法围绕 JavaScript 认为移动这么多没有意义。事实上,当您可以首先编写 = 0
时,执行这些计算毫无意义。
原因是移位计数被认为是模 32。
这本身就是因为(我的猜测)这是 desktops/laptops 目前最常见的硬件工作方式 (x86)。
这本身就是因为……好吧,只是因为。
这些轮班限制在某些情况下确实很烦人......例如,在我看来,最好只有一个轮班操作员,根据计数的符号在两个方向上工作(比如ASH
适用于 Common Lisp).
为什么按位左移会有不同的结果?
1 << 32; # 1
1 << 31 << 1; # 0
那是因为
Let
shiftCount
be the result of masking out all but the least significant 5 bits ofrnum
, that is, computernum & 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 字面上执行计算
JavaScript 定义左移 32 位不做任何事情,大概是因为它撞到了 32 位边界。你实际上不能移动超过 31 位的任何东西。
您首先移动 31 位,然后移动最后一位的方法围绕 JavaScript 认为移动这么多没有意义。事实上,当您可以首先编写 = 0
时,执行这些计算毫无意义。
原因是移位计数被认为是模 32。
这本身就是因为(我的猜测)这是 desktops/laptops 目前最常见的硬件工作方式 (x86)。
这本身就是因为……好吧,只是因为。
这些轮班限制在某些情况下确实很烦人......例如,在我看来,最好只有一个轮班操作员,根据计数的符号在两个方向上工作(比如ASH
适用于 Common Lisp).