二进制补码左移运算

Left shift operation with Ones' complement binary

我正在研究按位运算和有符号数表示。我已经认识到,如果我们在 ones 的补码模式上左移。它没有正确乘以原始数字。

例如(个数的补码):

11100101 (-26) << 1 = 11001010 (-53)

11110100 (-11) << 2 = 11010000 (-47)

-26 左移 1 位给出 -53(不是 -52),-11 左移 2 位给出 -47(不是 -44)。这就是人们选择二进制补码进行精度数字运算的原因吗?我在 google 上搜索过,但没有 post 提到左移和补码。差点用补码提到左移

在二进制补码中,负数A被正数编码2n-|A|并且可以通过 -2n-1 × an-1 + ∑0[=43 找到它的值=]n-2 2i × ai 很容易证明将这个值左移k 位将给出 A×2k 的代码,前提是没有溢出(即只有零或只有 1 被移出)。

在个数补码中,负数A用(A的2的补码)-1编码。其值为-2n-1×an-1+∑0n-22i×ai-1。如果我们左移k,结果的数值是(2k*A的2的补码)-2k*1(前提是没有溢出)。它与预期结果相差 2k-1,即(2k*A 的补码)-1

我们可以在您的示例中验证它:

C1(-26)<<1=-53(=-52-(21-1))
C1(-11)<<2=-47(=-44-(22-1))

因此,要将以 1 的补码编码的负数乘以 2k,您需要将其左移 k 并添加到您的结果 2k -1

一般来说,只有二进制补码给出了简单的算术运算。其他代码(余k、补码、符号绝对值)总是需要校正(这也是它们很少使用的原因)。