2010-06-16 2 views
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»? – KIAaze

+0

Кроме того, почему бы не просто '1 << n' вместо' 2 ** n'? –

ответ

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) 

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

Смежные вопросы