什么是x XOR(x / 2)的反转功能?

时间:2012-03-08 12:37:56

标签: bit-manipulation bitwise-operators algebra

什么是x XOR (x/2)的反向功能?

是否存在方程求解规则系统,类似于代数,但有逻辑运算符?

4 个答案:

答案 0 :(得分:7)

假设我们有一个N位数x。你可以写成:

b(N-1) b(N-2) b(N-3) ... b(0)

其中b(i)是数字中的位号i(其中0是最低有效位)。

x / 2与向左移位1位的x相同。我们假设无符号数。所以:

x / 2 = 0 b(N-1) b(N-2) ... b(1)

现在我们xx / 2

x ^ (x / 2) = b(N-1)^0 b(N-2)^b(N-1) b(N-3)^b(N-2) ... b(0)^b(1)

请注意,最右边的位(最高位)是b(N-1)^0 b(N-1)。换句话说,您可以立即从结果中获得位b(N-1)。如果你有这个位,你可以计算b(N-2),因为结果的第二位是b(N-2)^b(N-1)而你已经知道b(N-1)。依此类推,您可以计算原始数字b(N-1)的所有位b(0)x

答案 1 :(得分:3)

我可以用比特给你一个算法:

假设你有一个n位数组:

b = [b1 .. bn] // b1-bn are 0 or 1

原始数组是:

x0 = b0
x1 = b1 ^ x0
x2 = b2 ^ x1

或一般

x[i] = b[i] ^ x[i-1]

答案 2 :(得分:0)

假设Y = X ^(X / 2)

如果您想找到X,请执行此操作

X = 0

do

  X ^= Y
  Y /= 2

while Y != 0

我希望它有所帮助!

答案 3 :(得分:0)

我知道这是一个古老的话题,但我偶然发现了同样的问题,我发现了一个小技巧。如果你有 n 位,而不是要求 n 操作(比如Jesper的答案),你可以用 log2来做(n) 号码操作:

假设y在程序开头等于x XOR(x / 2),则可以执行以下C程序:

INPUT : y

int i, x;
x = y;
for (i = 1; i < n; i <<= 1)
    x ^= x >> i;

OUTPUT : x

在这里你有解决方案。

  • &#34;&GT;&GT;&#34;是正确的位移操作。例如,如果在右侧移位1,则二进制数13,1101将变为110二进制,因此13>&gt; 1 = 6.x&gt;&gt;我相当于x / 2 ^ i(当然是整数除法)
  • &#34;&LT;&LT;&#34;是左移位操作(i <= 1等于i * = 2)

为什么会这样?让我们以n = 5位为例,从y = b4开始b3 b2 b1 b0(二进制:在下面的x中也用二进制写,但我用十进制写)

  • 初始化:

x = b4 b3 b2 b1 b0

  • 第一步:i = 1

x&gt;&gt; 1 = b4 b3 b2 b1所以我们有 x = b4 b3 b2 b1 b0 XOR b3 b2 b1 b0 = b4(b3 ^ b4)(b2 ^ b3)(b1 ^ b2)(b0 ^ b1)

  • 第二步:i = 2

x&gt;&gt; 2 = b4(b3 ^ b4)(b2 ^ b3)所以我们有 x = b4(b3 ^ b4)(b2 ^ b3)(b1 ^ b2)(b0 ^ b1)XOR b4(b3 ^ b4)(b2 ^ b3)= b4(b3 ^ b4)(b2 ^ b3 ^ b4)( b1 ^ b2 ^ b3 ^ b4)(b0 ^ b1 ^ b2 ^ b3)

  • 第三步:i = 4

x&gt;&gt; 4 = b4所以我们有 x = b4(b3 ^ b4)(b2 ^ b3 ^ b4)(b1 ^ b2 ^ b3 ^ b4)(b0 ^ b1 ^ b2 ^ b3)XOR b4 = b4(b3 ^ b4)(b2 ^ b3 ^ b4)( b1 ^ b2 ^ b3 ^ b4)(b0 ^ b1 ^ b2 ^ b3 ^ b4)

  • 然后i = 8,超过5,我们退出循环。

我们有所需的输出。

循环有log2(n)次迭代,因为我从1开始并在每一步乘以2,所以为了达到n,我们必须做log2(n)次。