python中的异或操作_Python中的异或和位操作的反转

让我们考虑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[1] = x[1] ^ 0

y[0] = x[0] ^ x[1]

如果我们知道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]

可以对n位数进行泛化: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

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

示例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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值