【问题标题】:Why bitwise shift acts differently when sequenced?为什么按位移位在排序时表现不同?
【发布时间】:2016-08-28 10:18:50
【问题描述】:

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

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

【问题讨论】:

标签: javascript bitwise-operators bit-shift


【解决方案1】:

那是因为

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

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

所以根据它 - 32 &amp; 0x1F 等于 0

所以1 &lt;&lt; 32 等于1 &lt;&lt; 0 所以基本上没有操作。

而 31 和 1 的 2 个连续移位实际上执行计算

【讨论】:

    【解决方案2】:

    JavaScript 定义了一个 32 的左移来什么都不做,大概是因为它碰到了 32 位边界。您实际上不能移动超过 31 位的内容。

    您的方法首先移动 31 位,然后移动最后一位,这种方法适用于 JavaScript,认为移动这么多没有意义。事实上,如果你一开始就可以写= 0,那么执行这些计算是没有意义的。

    【讨论】:

      【解决方案3】:

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

      这本身会发生,因为(我猜)这是当今最常见的台式机/笔记本电脑硬件 (x86) 的工作方式。

      这本身的发生是因为....好吧,只是因为。

      在某些情况下,这些班次限制确实很烦人......例如,我认为最好只有一个班次操作员,根据计数的符号在两个方向上工作(如ASH 适用于Common Lisp)。

      【讨论】:

        猜你喜欢
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 2015-10-29
        相关资源
        最近更新 更多