使用Ones的补码二进制数

时间:2019-04-16 11:11:21

标签: binary bitwise-operators bit-shift negative-number ones-complement

我正在研究按位运算和带符号的数字表示形式。我已经认识到,如果我们不做补码的话。它不能正确乘以原始数字。

例如(一个人的补语):

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

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

-26左移1位给出-53(不是-52),-11左移2位给出-47(不是-44)。因此这就是人们选择二进制补码进行精确数字运算的原因。我已经在Google上搜索过,但是没有关于左移和补码的文章。几乎提到左移并带有二进制补码

1 个答案:

答案 0 :(得分:1)

在二进制补码中,负数A由正数2 n -| A |编码。并可以通过-2 n-1 ×a n-1 + ∑ 0 n-2 < / sup> 2 i ×a i 很容易证明,将此值左移k位将得到A×2 k ,前提是没有溢出(即,只有零或只有一个移出了)。

在一个补码中,负数A由A的(2的补码)-1编码。它的值为-2 n-1 ×a n-1 + ∑ 0 n-2 2 i ×a i -1。如果将其左移k,结果的数值为(2的2 k * A的补数)-2 k * 1(假设没有溢出) 。它与预期结果相差2 k -1,结果为(2 k * A的2的补码)-1

我们可以在您的示例中对其进行验证:

  

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

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

通常,只有二进制补码会给出简单的算术运算。其他代码(多余的k,补码,符号绝对值)始终需要进行更正(这就是为什么它们很少使用的原因)。