如何获得位旋转功能以接受任何位大小?

时间:2010-06-16 22:49:25

标签: python math rotation

我从其他一些代码中获得了这两个功能

def ROR(x, n):
    mask = (2L**n) - 1
    mask_bits = x & mask
    return (x >> n) | (mask_bits << (32 - n))

def ROL(x, n):
    return ROR(x, 32 - n)

我希望在程序中使用它们,需要16位旋转。然而,还有其他功能需要32位旋转,所以我想把32保留在等式中,所以我得到了:

def ROR(x, n, bits = 32):
    mask = (2L**n) - 1
    mask_bits = x & mask
    return (x >> n) | (mask_bits << (bits - n))

def ROL(x, n, bits = 32):
    return ROR(x, bits - n)
然而,当我测试这个问题时,答案出错了。然而,当代码

时,值正确显示
def ROR(x, n):
    mask = (2L**n) - 1
    mask_bits = x & mask
    return (x >> n) | (mask_bits << (16 - n))

def ROL(x, n,bits):
    return ROR(x, 16 - n)

发生了什么以及我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

好吧,看看你致电ROL(x, n, 16)时会发生什么。它会调用ROR(x,16-n),相当于ROR(x,16-n,32),但您真正想要的是ROR(x, 16-n, 16)

答案 1 :(得分:3)

基本上,@ GregS正确答案的含义是您需要在第二个实现中修复一个细节:

def ROL(x, n, bits=32):
    return ROR(x, bits - n, bits)

(我将此作为评论,但之后我无法在其中编写可读格式的代码! - )。