如何进行整数的二进制补码乘法和除法?

21
我已阅读了关于使用二进制补数进行乘法的这篇文章,但对我来说并不是很清楚。即使是在我阅读维基百科关于此问题的文章时也有困难。我想知道如何计算负数的乘法:
eg: -1 with -7 should give 7.
A 4-bit, 2's complement of -1 is : 1111
A 4-bit, 2's complement of -7 is : 1001

有一些逐步计算乘法的方式会很有帮助。我找到的文章都没有讲解除法。该如何解决这个问题?

2个回答

21

步骤1:将两个整数的位数扩展到原来的两倍,可以进行这个操作,但不一定总是必要的。sign extend

for 4-bit --> 1111, you would extend as 1111 1111
for 4-bit --> 0111,you would extend as 0000 0111

第二步:进行基本乘法

第三步:从结果的最低有效部分中取出正确数量的结果位。

例如:在乘法之后,您得到像 0010011110 这样的东西,请取最后8位,即 10011110

让我用您提供的示例进行说明:-1 X -7 以4位表达式表示

         1111 1111        -1
       x 1111 1001     x  -7
      ----------------    ------
          11111111         7
         00000000
        00000000
       11111111
      11111111
     11111111
    11111111
   11111111
   ----------------
1  00000000111       --->  7 (notice the Most significant bit is zer``o)
      --------  (last 8-bits needed) 

你可以在这里获得更多详细信息;

对于除法:将数值转换为正数,计算后再调整符号。我会把这部分作为练习留给你,但你可以参考这个页面


如果我只被允许使用4位表示,而无法扩展到8位,该怎么办? - eagertoLearn
1
@eagertoLearn:双倍位是为了计算目的,不是最终结果所必需的。但请注意,4位比特可以容纳的最大值是2^4-1,即15。 - brain storm
2
乘法不需要扩展到双倍宽度。只需对16取模即可完成计算。 - Raymond Chen
1
@RaymondChen:math mod 16是什么意思?您能详细解释一下吗? - eagertoLearn
1
@user1988876 尽管4位无符号值允许达到15,但我们正在使用有符号值,这意味着4位只能使我们达到7。 - David

3
好的,让我试着用简单易懂的语言为您解释一下。
二进制补码: 当且仅当你有一个负数时,首先将其转换为正式。为了简单起见,所有的数字都是6位的。位数的限制将限制你的数字可以达到多大。除此之外,数字的大小并不重要。
下面是一些转化为正的二进制形式的数字 -7: 000111 16: 010000 -22: 010110 1: 000001
现在只对-7和-23进行二进制补码转换。所以我们翻转这个数字(1变成0,0变成1),然后加上1。
 000111
 Goes to the complement + 1
 111000
 +    1
=111001

并为22个数字做准备

 010110
 Goes to the complement + 1
 101001
+     1
=101010

然后,您可以像处理其他数字一样将它们加在一起。

看起来有人已经解释了乘法部分,所以我不再重复。


1
没有问题。这样清楚吗?就我们两个人之间而言,我们有遗漏你问题的任何部分吗? - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接