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

cal*_*pto 1 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)
Run Code Online (Sandbox Code Playgroud)

我想在程序中使用它们,需要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)
Run Code Online (Sandbox Code Playgroud)

然而,当我测试这个问题时,答案出错了.然而,当代码是正确的时,值出现了

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)
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*olk 6

好吧,看看你打电话时会发生什么ROL(x, n, 16).它叫ROR(x,16-n),相当于ROR(x,16-n,32),但你真正想要的是ROR(x, 16-n, 16).