假设a = a31 a30 . . . a1 a0
是32位二进制字
考虑通过以下算法计算的32位二进制字b = b31 b30 . . . b1 b0
:
b
,直到找到第一个1
(也会复制到b
)a
中的位的布尔否定。例如,a = 10100 . . . 00
转换为b = 01100 . . . 00
。解释如果a
和b
被解释为二进制数,此算法将计算什么。
答案 0 :(得分:1)
这是2的补码计算。
您可以看到b
确实等于~a+1
,这意味着b
是a
的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
可能有一种较短的方法,不会跳过太多步骤..