You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:07:32