对于修改后的Baugh-Wooley乘法算法,为什么是(A0 * B5)而不是仅仅(A0 * B5)?
!(A1 * B5),!(A2 * B5),!(A3 * B5),!(A4 * B5),!(A5 * B4),!(A5 * 3),!( A5 * B2),!(A5 * B1)和!(A5 * B0)
此外,为什么还有两个额外的“ 1”?
答案 0 :(得分:2)
在带符号的6位2s补码表示法中,位的位置值为:
-32 16 8 4 2 1
请注意,最高位为负值。但是,在mod 64上执行加,减和乘运算时,该负号对这些运算的工作方式完全没有影响,因为32 = -32 mod 64。
您的乘法不是 在mod 64中执行的,因此必须考虑符号。
想到乘法的一种方法是将6位数字扩展为12位,然后在mod 4096中执行乘法。扩展有符号数时,将复制最高位,因此-32变为-2048 + 1024 + 512 ... +32,它们的总和为-32。因此,扩展有符号数并相乘。我将用3位,乘以mod 64:
Given: Sign-extended:
A2 A1 A0 A2 A2 A2 A2 A1 A0
B2 B1 B0 B2 B2 B2 B2 B1 B0
Multiply:
A0B2 A0B2 A0B2 A0B2 A0B1 A0B0
A1B2 A1B2 A1B2 A1B1 A1B0
A2B2 A2B2 A2B1 A2B0
A2B2 A2B1 A2B0
A2B1 A2B0
A2B0
由于我们在多个位置复制了相同的位,因此您将在多个位置看到相同的位乘积。
A0B2出现4次,总位置值为60或15 << 2,依此类推。让乘数写在:
A0B2*15 A0B1 A0B0
A1B2*7 A1B1 A1B0
A2B2*5 A2B1*7 A2B0*15
同样,由于采用模块化算法,* 15和* 7与* -1相同,* 5与* 1相同:
-A0B2 A0B1 A0B0
-A1B2 A1B1 A1B0
A2B2 -A2B1 -A2B0
这种模式开始看起来很熟悉。现在,当然-1不是位值,而是〜A0B2 = 1-A0B2,因此我们可以将-A0B2转换为〜A0B2,然后减去我们添加的额外1。如果我们对所有减去的乘积执行此操作:
~A0B2 A0B1 A0B0
~A1B2 A1B1 A1B0
A2B2 ~A2B1 ~A2B0
-2 -2
如果我们将那些-2的位值相加并将其扩展为等效位,则会发现图中其他1的来源:
~A0B2 A0B1 A0B0
~A1B2 A1B1 A1B0
A2B2 ~A2B1 ~A2B0
1 1
答案 1 :(得分:0)
为什么还要再加上两个“ 1”?
请参阅Matt Timmermans的回答中的先前解释
注意:两个补码中的“ -2”为110,这会影响进位,因此又增加了两个“ 1”
为什么翻转某些部分乘积位的值。
这是由于MSB(A5和B5)中的有符号位。
此外,在{_3}}的帮助下,在A_WIDTH!= B_WIDTH的情况下,请参见下面的针对改进的baugh-wooley算法的对策。
答案 2 :(得分:-1)
简短的回答是因为2's-complement表示是如何工作的:高位实际上是符号位,因此1
表示-
。换句话说,你必须减去
A5*(B4 B3 B2 B1 B0) << 5
和
B5*(A4 A3 A2 A1 A0) << 5
从总和(请注意,A5*B5
被再次添加,因为它们都具有相同的-
符号)。而这两个1
是用这两个减法加上-X
的结果。
如果您需要更多细节,则可能只需要重新阅读2的补码工作原理,然后重新阅读Baugh-Wooley乘法算法背后的全部数学原理即可。没那么复杂。