在整数上执行任意大的位旋转

时间:2018-12-02 20:42:31

标签: python optimization bit-manipulation bit-shift

我正在尝试在Python中对非负16位整数执行非常大的位旋转,但这非常慢。我尝试通过以16的模为单位对过程进行优化,但是在其末尾留下了一堆零。有没有什么办法解决这一问题?我们可以将二进制文件截断为16位窗口吗?还有其他提高性能的方法吗?我不能使用任何外部库。

操作示例为23748 >> 8857328954。

这是我尝试的一些代码示例:

x = 35233
y = 738337234 % 16
x >> y

1 个答案:

答案 0 :(得分:1)

>>运算符不是循环移位-它将完全丢弃移位到LSB之外的值,而不是绕回MSB:

>>> bin(51)[2:].zfill(6)
'110011'
>>> bin(51 >> 3)[2:].zfill(6)
'000110'

您将第二个操作数取模为第一个操作数的位长的想法是正确的,但是您需要执行一些额外的操作来恢复那些被丢弃的位。

def cshift_right(num, dist):
     v1 = num >> (dist % 16)                  # this is your original logic
     v2 = (num << (16 - dist % 16)) & 0xFFFF  # shift left, and mask off higher bits
     return v1 | v2                           # combine the two results

验证是否可行:

>>> bin(51)[2:].zfill(16)
'0000000000110011'
>>> bin(cshift_left(51, 3))[2:].zfill(16)
'0110000000000110'