Tourner À Droite Au Niveau Du Bit

Je suis en train de convertir cette fonction de C en Python;

typedef unsigned long var;
    /* Bit rotate rightwards */
    var ror(var v,unsigned int bits) {
        return (v>>bits)|(v<<(8*sizeof(var)-bits));
    }

J'ai essayé de Googler pour certaines solutions, mais je ne peux pas sembler obtenir de leur donner les mêmes résultats que celui qui est ici.

C'est une solution que j'ai trouvé à partir d'un autre programme;

def mask1(n):
   """Return a bitmask of length n (suitable for masking against an
      int to coerce the size to a given length)
   """
   if n >= 0:
       return 2**n - 1
   else:
       return 0

def ror(n, rotations=1, width=8):
    """Return a given number of bitwise right rotations of an integer n,
       for a given bit field width.
    """
    rotations %= width
    if rotations < 1:
        return n
    n &= mask1(width)
    return (n >> rotations) | ((n << (8 * width - rotations)))

Je suis en train de btishift key = 0xf0f0f0f0f123456. Le code C donne 000000000f0f0f12 lorsqu'elle est appelée avec; ror(key, 8 << 1) et Python donne; 0x0f0f0f0f0f123456 (de l'entrée d'origine!)

Pourquoi êtes-vous en passant en 8 << 1pour les rotations, alors? De plus width, si vous vous retrouvez avec 0 rotations (16 % 8 est 0).
C'est dans une boucle jusqu'à 3. Donc, il va rotations seront 8 << 0, 8<<1, 8<<2.
Tous ceux qui sont plus grands que width et multiples de width, donc rotations %= width sera toujours 0.
Je comprends que. Si je change width j'obtiens des résultats qui ne sont pas encore comparable à celle de la C de sortie.
La sortie C ressemble à une rotation de 16 bits, avec un masque de 32 bits. Je n'ai aucune idée de pourquoi vous utilisez rotations %= width à tous ici.

OriginalL'auteur Jake Evans | 2014-11-27