<p>让我们把这个分解。</p>
<pre><code>return ( ((x & 0xaaaaaaaa) >>> 1) | ((x & 0x55555555) << 1) );
</code></pre>
<p>首先,我们来看看<code>(x & 0xaaaaaaaa)</code>。如果将<code>0xaaaaaaaa</code>分解到位级别,则最终得到<code>1010 1010 1010 1010 1010 1010 1010 1010</code>(因为<code>a</code>,在二进制中是<code>1010</code>)。所以<code>(x & 0xaaaaaaaa)</code>是说,只返回<code>x</code>中每个偶数放置的<code>1</code>。这叫做位掩蔽。然后,你把它右移一个位置-这就是你如何使偶数交换位置(所以现在第二位占据了第一位的位置,第四位占据了第三位,等等)。</p>
<p>你对<code>(x & 0x55555555)</code>做同样的事情-如果你把它分解到位级别,你最终得到<code>0101 0101 0101 0101 0101 0101 0101 0101</code>(因为<code>5</code>,在二进制中,是<code>0101</code>)。这将屏蔽<code>x</code>中的所有偶数位,并为您提供所有奇数位。然后,将所有位左移1。最后,使用<code>or</code>(<code>|</code>)运算符组合这两个位序列,这就是您的答案。</p>
<p>示例:
我们乘2456086205吧。我们把它转换成二进制,得到<code>1001 0010 0110 0100 1110 0110 1011 1101</code>。现在,我们做<code>(x & 0xaaaaaaaa)</code>,得到</p>
<p><code>1001 0010 0110 0100 1110 0110 1011 1101 & 1010 1010 1010 1010 1010 1010 1010 1010</code></p>
<p>等于<code>1000 0010 0010 0000 1010 0010 1010 1000</code>。把这个移到右边,就会得到<code>0100 0001 0001 0000 0101 0001 0101 0100</code>。</p>
<p>现在,做<code>(x & 0x55555555)</code>,然后</p>
<p><code>1001 0010 0110 0100 1110 0110 1011 1101 & 0101 0101 0101 0101 0101 0101 0101 0101</code></p>
<p>等于<code>0001 0000 0100 0100 0100 0100 0001 0101</code>。把这个移到左边,就会得到<code>0010 0000 1000 1000 1000 1000 0010 1010</code>。</p>
<p>最后,我们做<code>0100 0001 0001 0000 0101 0001 0101 0100 | 0010 0000 1000 1000 1000 1000 0010 1010</code>。然后我们得到<code>0110 0001 1001 1000 1101 1001 0111 1110</code>,正如您所看到的,这就是解决方案!</p>