Как заставить функцию поворота бита принять любой размер бита? - PullRequest
1 голос
/ 17 июня 2010

У меня есть эти 2 функции, которые я получил из некоторого другого кода

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 ]

6 голосов
/ 17 июня 2010

Хорошо, просто посмотрите, что происходит, когда вы звоните ROL(x, n, 16). Он вызывает ROR(x,16-n), что эквивалентно ROR(x,16-n,32), но то, что вы действительно хотели, было ROR(x, 16-n, 16).

3 голосов
/ 17 июня 2010

По сути, правильные ответы @ GregS означают, что вам нужно исправить одну деталь во второй реализации:

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

(я бы оставил комментарий, но потом не смогчитабельно отформатированный код в нем! -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...