У меня есть эти 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)
что происходит и как это исправить?
Хорошо, просто посмотрите, что произойдет, когда вы вызываете ROL(x, n, 16)
. Он вызывает ROR(x,16-n)
, что эквивалентно ROR(x,16-n,32)
, но то, что вы действительно хотели, было ROR(x, 16-n, 16)
.
В основном, правильность ответов @GregS заключается в том, что вам нужно исправить одну деталь во второй реализации:
def ROL(x, n, bits=32):
return ROR(x, bits - n, bits)
(Я бы сделал это комментарием, но тогда у меня не было бы хорошо отформатированного кода! -).
1 << n
вместо2**n
?