2 réponses
Salut,
Je sais pas si c'est "efficace", mais moi je fais ça comme ceci:
#define ROL(x,b) (((x) >> (b)) | ((x) << (32 - (b))))
ça fait un ou logique entre les bits de poids forts décalés vers la droite (les MSB sont donc nuls) et les bits de poids faibles vers la gauche (donc les LSB sont nuls et le résultat du ou est correct)
dans mon exemple, j'ai donc
- a = 0A00000F
- a >> 16 = 00000A00
- a << 16 = 000F0000
- or = 000F0A00
ce qui correspond bien à une rotation de 16 bits vers la gauche.
voilà, j'espère que ça aide.
Je sais pas si c'est "efficace", mais moi je fais ça comme ceci:
#define ROL(x,b) (((x) >> (b)) | ((x) << (32 - (b)))) int main(int argc, char * argv[]) { int a = 0x0A00000F; printf("%8.8x\tROL : %8.8x\n", a, ROL(a,16)); getchar(); return 0; }
#define ROL(x,b) (((x) >> (b)) | ((x) << (32 - (b))))
ça fait un ou logique entre les bits de poids forts décalés vers la droite (les MSB sont donc nuls) et les bits de poids faibles vers la gauche (donc les LSB sont nuls et le résultat du ou est correct)
dans mon exemple, j'ai donc
- a = 0A00000F
- a >> 16 = 00000A00
- a << 16 = 000F0000
- or = 000F0A00
ce qui correspond bien à une rotation de 16 bits vers la gauche.
voilà, j'espère que ça aide.