La fonction reverse doit fonctionner mieux que la solution proposee precedemment. Tous les processeurs n'ont pas forcement d'instructions pour faire un decalage de plusieurs positions (a gauche ou a droite).
Par contre j'ai aucune idee des performances de la fonction reverse2, j'ai juste trouve que c'etait marrant.
unsigned char reverse (unsigned char x)
{
int i;
unsigned char r = 0;
for (i = 0; i < 8; i++) {
r = (r << 1) | (x & 1);
x >>= 1;
}
return(r);
}
unsigned char reverse2 (unsigned char x)
{
unsigned char rev[] = { 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10,
0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01 };
int i;
unsigned char r = 0;
for (i = 0; i < 16; i += 2) {
r |= rev[i + (x & 1)];
x >>= 1;
}
return(r);
}
main()
{
int i;
printf("reverse:\n");
for (i = 0; i < 8; i++) {
unsigned char x = 1 << i;
printf("%02x -> %02x\n", x, reverse(x));
}
printf("reverse2:\n");
for (i = 0; i < 8; i++) {
unsigned char x = 1 << i;
printf("%02x -> %02x\n", x, reverse2(x));
}
}
# Autres solutions
Posté par xoffox . En réponse au message Comment effectué une rotation de bit sur un Byte ?. Évalué à 1.
Par contre j'ai aucune idee des performances de la fonction reverse2, j'ai juste trouve que c'etait marrant.
unsigned char reverse (unsigned char x)
{
int i;
unsigned char r = 0;
for (i = 0; i < 8; i++) {
r = (r << 1) | (x & 1);
x >>= 1;
}
return(r);
}
unsigned char reverse2 (unsigned char x)
{
unsigned char rev[] = { 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10,
0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01 };
int i;
unsigned char r = 0;
for (i = 0; i < 16; i += 2) {
r |= rev[i + (x & 1)];
x >>= 1;
}
return(r);
}
main()
{
int i;
printf("reverse:\n");
for (i = 0; i < 8; i++) {
unsigned char x = 1 << i;
printf("%02x -> %02x\n", x, reverse(x));
}
printf("reverse2:\n");
for (i = 0; i < 8; i++) {
unsigned char x = 1 << i;
printf("%02x -> %02x\n", x, reverse2(x));
}
}