Как заставить функцию поворота бита принять любой размер бита?

1

У меня есть эти 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)

что происходит и как это исправить?

  • 1
    Что там делает буква "L"? Разве это не должно быть "2 n" вместо "2L n"?
  • 0
    Кроме того, почему бы не просто 1 << n вместо 2**n ?
Теги:
math
rotation

2 ответа

6

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

  • 0
    Первый ROR должен быть ROL?
  • 0
    Да, спасибо. Редакция.
3

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

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

(Я бы сделал это комментарием, но тогда у меня не было бы хорошо отформатированного кода! -).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню