<p>您可以在查找表中存储函数:</p>
<pre><code>table = [
lambda x:x,
lambda x:x,
lambda x:x | ((x & 0b0001) << 1),
...
]
</code></pre>
<p>我想问一下,为什么要在Python中通过位移位整数来实现这一点。如果是为了性能,我认为通过一系列的位移位操作来实现这一点是个坏主意。解释器的开销将完全淹没位移位可以实现的任何速度优势。如果是为了内存使用,因为需要在内存中容纳数百万个这样的数组,那么最好看看numpy,它可以创建内存高效的数组,并在整个数组中同时应用操作。你知道吗</p>
<p>我能想到的一个很好的理由是,在用C这样的低级语言实现算法之前,你需要先对算法进行实验,我怀疑,只有在使用非常有限的硬件或进行非常密集的计算时,性能优势才会明显——也许你在模拟成千上万的《宝石迷航》游戏。如果你这样做只是为了计算一个人实时玩的游戏的一个实例的逻辑,我怀疑位转移优化是否有意义。你知道吗</p>
<p>如果你想用移位的方法来做这件事,你能这样做吗?与其一步一个脚印地完成,不如循环直到没有更多的位元可以“掉落”。您最多只需要循环整数中位的次数。你知道吗</p>
<p>假设你有这样的模式:</p>
<pre><code> PATTERN : ab c d
HOLES : 00110110
</code></pre>
<p>找到最高的设定位:最左边的孔。(您可以执行类似的操作:<a href="https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2" rel="nofollow">https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2</a>)</p>
<pre><code> LEFTMOST HOLE : 00100000
</code></pre>
<p>现在把那个洞去掉。左边的一切都不会改变。右边的东西都会左移一个。为这些区域创建遮罩。你知道吗</p>
<pre><code> CAN FALL : 00011111 ( == LEFTMOST HOLE - 1)
WON'T CHANGE : 11000000 ( == invert CAN FALL and shift left )
</code></pre>
<p>使用这些掩码来切碎、移动和重新组合所有其他位字段。你知道吗</p>
<pre><code> KEEP THIS : ab
SHIFT THIS : -c d
RESULT : ab-c d-
</code></pre>
<p>最后,重复此过程,直到“CAN FALL”遮罩仅选择孔。它不会以严格的最小操作数执行您的操作,但是它应该相对容易理解,并且不需要大型查找表的复杂性。你知道吗</p>