Python中位运算反转求助:无法还原&操作,求修正循环移位代码
反转8位循环左移操作的解决方案
我明白你遇到的困扰了——按位与本身确实不可逆,但循环移位这类操作是可逆的,只要找到对应的逆操作就行。先帮你理清思路:
首先,你提到的原操作((n << d) & 0xff) | (n >> (8 - d))是一个8位无符号整数的循环左移(左旋转)d位操作。它的逻辑是把n的高d位移到低d位的位置,同时低(8-d)位左移d位,最后用&0xff确保结果始终是8位。
要反转这个操作,本质上就是找到一个操作,能把循环左移后的结果还原回原始的n。对应的逆操作其实是对结果执行循环右移d位,或者等价地执行循环左移8-d位。
你的代码问题在哪?
你写的函数:
def lrot(n, d): return ((n >> d) & 0xff) | (n << (8 - d))
其实逻辑是对的——这就是循环右移d位的实现,也就是循环左移的逆操作。但可能你在调用的时候出了问题?比如你是不是把原始的n传进去了,而不是循环左移后的结果?
正确的实现示例
先把原循环左移函数明确写出来:
def lrot(n, d): # 8位循环左移d位,处理d>=8的无效移位情况 d = d % 8 return ((n << d) & 0xff) | (n >> (8 - d))
对应的反转函数(还原原始n)可以写成:
def reverse_lrot(m, d): # m是循环左移后的结果,还原回原始n d = d % 8 return ((m >> d) & 0xff) | (m << (8 - d))
验证例子
我们用一个具体数值测试:
- 原始n = 0b10000001(十进制129)
- 循环左移1位后,
lrot(129,1)得到3(0b00000011) - 用反转函数还原:
reverse_lrot(3,1)得到129,和原始n一致,验证成功!
额外提示
如果d的值可能大于8,记得用d % 8取模,因为8位的循环移位,移位8位等于没移位,这样能避免不必要的计算。
内容的提问来源于stack exchange,提问作者Vernon Nabibya
相关产品推荐
相关产品推荐

