Python中的反异或和逐位运算

Python中的反异或和逐位运算,python,bitwise-operators,xor,Python,Bitwise Operators,Xor,我尝试了很多搜索,但我无法找到一个解决方案,以扭转异或和位运算相结合 num[i] = num[i]^( num[i] >> 1 ); 如何使用Python反转此操作。我尝试了这里解释的XOR概念: 仍然无法解决数学问题。有关转换的更快版本,请参阅 让我们考虑2位数字: 00 = 00 ^ 00 (0 -> 0) 01 = 01 ^ 00 (1 -> 1) 11 = 10 ^ 01 (2 -> 3) 10 = 11 ^ 01 (3 -> 2) 如果y[

我尝试了很多搜索,但我无法找到一个解决方案,以扭转异或和位运算相结合

num[i] = num[i]^( num[i] >> 1 );
如何使用Python反转此操作。我尝试了这里解释的XOR概念:


仍然无法解决数学问题。

有关转换的更快版本,请参阅


让我们考虑2位数字:

00 = 00 ^ 00 (0 -> 0)
01 = 01 ^ 00 (1 -> 1)
11 = 10 ^ 01 (2 -> 3)
10 = 11 ^ 01 (3 -> 2)
如果
y[i]
是第i位(小尾端),则从
y=x^(x>>1)
如下:

y[1]y[0] = x[1]x[0] ^ 0x[1] # note: y[1]y[0] means `(y[1] << 1) | y[0]` here
如果我们知道
y
,那么要得到
x

 y[i] = (y & ( 1 << i )) >> i
 x[1] = y[1] ^ 0
 x[0] = y[0] ^ x[1] = y[0] ^ (y[1] ^ 0)
 x = (x[1] << 1) | x[0]
y2x()
可以简化为在不使用位数组的情况下处理数字:

def y2x(y):
    assert y >= 0    
    x = 0
    for i in range(y.bit_length() - 1, -1, -1):
        if getbit(y, i) ^ getbit(x, i + 1):
            x |= (1 << i) # set i-th bit
    return x
输出 那太好了。《黑客的喜悦》中还有一章是关于这一点的。维基百科的那篇文章中有一些代码,但为了避免只提供链接的答案,下面是如何构造反向:
do
x^=x>>(1>移位数:
x^=x>>移位数

shiftamount您能为输入和输出提供一个例子吗?XOR是一个二进制运算符。它需要两个操作数才能工作。要反转它的效果,您至少需要两个操作数。但您只有一个操作数。因此,可能会有许多数字组合产生结果。@thefourtheye:XOR的逆运算是XOR,mate!+1用于识别灰色代码。你应该添加一个适用于任意精度Python整数的小Python代码片段。@J.F.Sebastian好的,我可以试试,我不知道多少Python思想我添加了代码示例。你可以用你的代码替换它。@J.F.Sebastian好的,谢谢,应该可以使它以对数时间运行,我已经在Gra上测量了时间性能第30个梅森素数(
p=2**132049-1
)的y代码。您的代码快1000倍(731ms比280µs)。
def getbit(x, i):
    return (x >> i) & 1

def y2x(y):
    assert y >= 0    
    xbits = [0] * (y.bit_length() + 1)
    for i in range(len(xbits) - 2, -1, -1):
        xbits[i] = getbit(y, i) ^ xbits[i + 1] 

    x = 0
    for i, bit in enumerate(xbits):
        x |= (bit << i) 
    return x
def y2x(y):
    assert y >= 0    
    x = 0
    for i in range(y.bit_length() - 1, -1, -1):
        if getbit(y, i) ^ getbit(x, i + 1):
            x |= (1 << i) # set i-th bit
    return x
print("Dec Gray Binary")
for x in range(8):
    y = x ^ (x >> 1)
    print("{x: ^3} {y:03b}  {x:03b}".format(x=x, y=y))
    assert x == y2x(y)
Dec Gray Binary
 0  000  000
 1  001  001
 2  011  010
 3  010  011
 4  110  100
 5  111  101
 6  101  110
 7  100  111
x ^= x >> 1;
x ^= x >> 2;
x ^= x >> 4;
x ^= x >> 8;
x ^= x >> 16;
def gray2binary(x):
    shiftamount = 1;
    while x >> shiftamount:
        x ^= x >> shiftamount
        shiftamount <<= 1
    return x