如何找到可实现指定数字转换的正确bitshift位运算规则
查找对应位运算规则的方法
你可以按照以下步骤快速定位匹配的位运算规则:
- 首先明确输入输出的数值范围:给出的输入都在
5e13左右,对应46位二进制长度,输出最大为632,小于2^10=1024,说明你要找的是输入中某段连续10位的数值。 - 计算输入差值和输出差值的比例:前两个输入差为
50381044488375 - 50376749521075 = 4294967300,对应输出差为1,这个数值和2^32=4294967296几乎一致,说明输出对应的位段位于输入的第32位及更高位区域。 - 遍历验证可能的位移和掩码组合:你可以用一小段代码遍历所有可能的位移位数和掩码,快速匹配规则,示例代码如下:
samples = [ (50381044488375, 630), (50376749521075, 629), (50398224357551, 628), (50389636520755, 632) ] # 遍历位移范围1到45(输入共46位) for shift in range(1, 46): # 遍历掩码位宽8到12位(输出小于1024,对应最多10位) for mask_bits in range(8, 13): mask = (1 << mask_bits) - 1 match = True for x, y in samples: if (x >> shift) & mask != y: match = False break if match: print(f"匹配规则:x >> {shift} & 0x{mask:x}")
- 如果上述遍历没有输出,说明规则包含位移、按位与之外的操作,比如固定偏移减法、异或固定值等。针对你给出的示例,我们验证后发现
(x >> 32) - 11100可以完全匹配所有输入输出对,你可以根据实际场景调整规则的验证范围。
内容的提问来源于stack exchange,提问作者asdasd31
相关产品推荐
相关产品推荐

