答案 0 :(得分:1)
为什么“串行添加位消除了对进位链的需要”?
通过一组加法和移位运算来完成乘法。 加法的每个结果都用作下一个加法器(称为累加)的输入,另一个输入是乘数移位一位。
标准二进制乘法A * B,其中B = 2 ^ n-1 * b_n-i + ... + 2 ^ 1 * b_1 + 2 ^ 0 * b_0是通过以下算法完成的
let yCoord = collectionView.contentSize.height >= view.frame.height - viewHeight
? collectionView.contentSize.height
: view.frame.height - viewHeight
let bottomView = UIView(frame: CGRect(x: 0, y: yCoord, width: collectionView.contentSize.width, height: viewHeight))
collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: viewHeight, right: 0)
collectionView.addSubview(bottomView)
通常,添加操作需要将进位从LSB传播到MSB(进位链)。但是对于累加,可以使用“进位保存加法”,这是执行乘法的标准方法。在这种情况下,不是将输出进位馈送到下一个加法器(进位链)的输入进位,而是将其保存并在下一个加法中移位使用。
这样,一个加法步骤只需要经过一层加法器,而不是涉及进位链的n个。请注意,进位保存可以加快内部累加步骤,但是加法器的总和输出将保持不完整,直到有效传播进位为止。
这就是图中所示的内容。存储进位(在右下方)(在蓝色寄存器中),并用作该加法器下次加法的输入。存储加法器总和输出(在每个加法器的右上角)并移至下一个加法器的一个输入,而不再修改的LSB移出。
请注意,乘法算法的左移(A <= A * 2)被结果的右移代替,如图所示。这样既不携带也不要求A进行任何移动。
因此,乘法将需要n步(被乘数B中的每一位),但是每一步可以很快,因为它只需要遍历一个加法器即可。
为正确起见,最终结果需要完全添加到进位中。这可以通过带有进位链的标准加法器来完成,也可以通过将乘数设置为零的N个额外的位串行加法步骤来完成。
我不明白为什么将第一位串行2的补码块放在后续的位串行加法器之前?
我认为这个数字有些不正确。该示意图对应于无符号乘法。带符号的乘法需要不同的步骤或数据重新编码(例如Booth重新编码)。这种重新编码在链接末尾的页面末尾进行了说明,并且在每个步骤都需要加或减,但该图使用常规的二进制编码而不是2的补码。