数论:解决方案的需要

时间:2014-01-20 15:44:09

标签: algorithm twos-complement number-theory digital-logic

假设a = a31 a30 . . . a1 a0是32位二进制字 考虑通过以下算法计算的32位二进制字b = b31 b30 . . . b1 b0

  1. 从右向左扫描并将其位复制到b,直到找到第一个1(也会复制到b
  2. 之后,复制a中的位的布尔否定。
  3. 例如,a = 10100 . . . 00转换为b = 01100 . . . 00。解释如果ab被解释为二进制数,此算法将计算什么。

2 个答案:

答案 0 :(得分:1)

这是2的补码计算。

您可以看到b确实等于~a+1,这意味着ba的2补码。

答案 1 :(得分:0)

这是两个人的补充,正如蒂姆拉所指出的那样。如果您已经知道(如我所知),那么答案很容易找到,但很难推导出来。

从复制的部分开始:

copy_mask = a ^ (a - 1)    // extract rightmost 1 and smear to the right

显然,未被复制的部分(因此被称为“否定”)只是该面具的补充:

negated_mask = ~copy_mask

现在我们可以构建b

b = (a & copy_mask) | (~a & ~copy_mask)

替换:

b = (a & (a ^ (a - 1))) | (~a & ~(a ^ (a - 1)))

简化:

// move complement into xor
b = (a & (a ^ (a - 1))) | (~a & (a ^ ~(a - 1)))
// use two's complement definition
b = (a & (a ^ (a - 1))) | (~a & (a ^ -a))
// use two's complement definition
b = (a & ~(a ^ -a)) | (~a & (a ^ -a))
// use definition of xor: p^q = (p&~q)|(~p&q)
b = a ^ (a ^ -a)
// use xor associativity
b = (a ^ a) ^ -a
// simplify xor with self
b = -a

可能有一种较短的方法,不会跳过太多步骤..