2s赞美一般形式

时间:2016-09-24 21:13:38

标签: algorithm language-agnostic bit-manipulation

假设我的系统具有在mod n中工作的整数。因此,对于我的整数,向n-1添加一个实际上等于零。

进一步假设您将数字的二进制补码定义为添加到自身时的数字等于零。那就是:

x + C(x) = 0   (here C(x) is the twos compliment of x)

我应该做些什么才能得到x的两个赞美?

真正的问题:

如果x是二进制数,我可以反转x的所有位,然后在该数字上加一。

如果x表示三位数,这会变得有点棘手。这个问题是它与偶数位不匹配,所以你会尝试翻转2/3或者其他东西,我没有任何线索是什么意思。

所以我的问题是这样的:我如何能够颂扬两个人的恭维?

1 个答案:

答案 0 :(得分:1)

我将假设您正在使用基数s处理某个整数s > 0,并且您尝试以某个固定整数s^(n+1)为模n > 0来表示数量。换句话说,最多使用n+1个地方(或数字)。

因此,您将此系统中的整数表示为序列[xn ... x0],其中每个xi都是0s-1之间的数字。例如,如果s=3n=4,则表示[01201]将对应于十进制数0*3^4 + 1*3^3 + 2*3^2 + 0*3^1 + 1*3^0 = 27 + 18 + 1 = 46

一般来说,上述表示的十进制值为:

x = xn*s^n + ... + x0*s^0

现在,您的问题在于找到-x modulo s^(n+1)的表示形式(请记住,我们只能使用s+1“数字”。

将每个数字xi补充定义为s

c(xi) = s - 1 - xi

请注意,在二进制的情况下,当s=2时,2的补语符合相同的定义。还要注意

xi + c(xi) = s - 1                                          eq(1)

现在让我在这里使用更简单的表示法并调用yi = c(xi)。然后是序列

y = [yn ... y0]

是我们可以称之为 s x的补充。它也是-x - 1 modulo s^(n+1)的表示,因此要获得-x,您只需将1添加到y。例如,在x=[01201]的情况下,我们会y=[21021],因为每个位置的数字加3-1=2

原因很简单:

[yn ... y0] + [xn ... x0]
            = yn*s^n + ... + y0*s^0 + xn*s^n + ... + x0*s^n
            = (yn+xn)*s^n + ... + (y0+x0)*s^0
            = (s-1)*sˆn + ... + (s-1)*s^0              ; by eq(2)
            = s^(n+1) + ... + sˆ1 - (s^n + ... + s^0)
            = s^(n+1) - 1
            = -1  modulo s^(n+1)

因此,事情与s=2时的工作方式类似,例如模2^32(32位)。从这个意义上说,二元情况没有什么特别之处。