2010-06-16 3 views
1

i ont ces 2 fonctions j'ai obtenu d'un autre code deComment faire pour que la fonction de rotation des bits accepte une taille de bit?

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) 

et je voulais les utiliser dans un programme, où sont nécessaires 16 rotations de bits. Cependant, il y a aussi d'autres fonctions qui nécessitent 32 rotations de bits, alors je voulais quitter le 32 dans l'équation, alors je suis:

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) 

cependant, les réponses sont sortis mal quand je l'ai testé ce exposé. pourtant, les valeurs sont sortis correctement lorsque le code est

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) 

ce qui se passe et comment puis-je résoudre ce problème?

+1

Que fait un "L" dedans? Ne devrait-il pas être simplement "2 ** n" au lieu de "2L ** n"? – KIAaze

+0

Aussi, pourquoi ne pas simplement '1 << n' au lieu de' 2 ** n'? –

Répondre

6

Eh bien, regardez ce qui se passe lorsque vous appelez ROL(x, n, 16). Il appelle ROR(x,16-n), ce qui équivaut à ROR(x,16-n,32), mais ce que vous vouliez vraiment, c'était ROR(x, 16-n, 16).

+0

Le premier ROR devrait être ROL? –

+0

oui, merci. ÉDITÉ. –

3

Fondamentalement, l'implication de @ GREGS est réponses sont que vous devez corriger un détail dans votre deuxième mise en œuvre:

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

(je ferais ce commentaire, mais je ne pouvais pas lisiblement code formaté dedans! -).

Questions connexes