什么是x XOR (x/2)
的反向功能?
是否存在方程求解规则系统,类似于代数,但有逻辑运算符?
答案 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)
现在我们x
与x / 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
在这里你有解决方案。
为什么会这样?让我们以n = 5位为例,从y = b4开始b3 b2 b1 b0(二进制:在下面的x中也用二进制写,但我用十进制写)
x = b4 b3 b2 b1 b0
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)
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)
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)
我们有所需的输出。
循环有log2(n)次迭代,因为我从1开始并在每一步乘以2,所以为了达到n,我们必须做log2(n)次。