擅长:python、mysql、java
<p>本质上,问题是符号从32位扩展到。。。无限位数,因为Python有任意大的整数。通常,符号扩展是在强制转换时由CPU指令自动完成的,因此有趣的是,在Python中这比在C中更难实现</p>
<p>通过四处玩弄,我发现了一些类似于BreizhGatch函数的东西,但这不需要条件语句。<code>n & 0x80000000</code>提取32位符号位;然后,<code>-</code>保持相同的32位表示,但符号扩展它;最后,扩展符号位设置在<code>n</code>。</p>
<pre><code>def toSigned32(n):
n = n & 0xffffffff
return n | (-(n & 0x80000000))
</code></pre>
<p><a href="https://graphics.stanford.edu/~seander/bithacks.html#VariableSignExtend" rel="noreferrer">Bit Twiddling Hacks</a>提出了另一种可能更通用的解决方案。<code>n ^ 0x80000000</code>翻转32位符号位;然后<code>- 0x80000000</code>将符号扩展到相反的位。另一种思考方法是,最初负数高于正数(用<code>0x80000000</code>分隔);然后<code>^</code>交换它们的位置;然后<code>-</code>将负数移到0以下。</p>
<pre><code>def toSigned32(n):
n = n & 0xffffffff
return (n ^ 0x80000000) - 0x80000000
</code></pre>