lookup table (table de correspondance/macros ) : Syntaxe
Au cours d'une de mes lectures de cours C, je suis tombé sur ce bout de code qui permet d'optimiser une inversion de bits dans un entier par une référence à une table de correspondance :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Reverse bits in word by lookup table :
static const unsigned char BitReverseTable256[256] =
{
# define R2(n) n, n + 2*64, n + 1*64, n + 3*64
# define R4(n) R2(n), R2(n + 2*16), R2(n + 1*16), R2(n + 3*16)
# define R6(n) R4(n), R4(n + 2*4 ), R4(n + 1*4 ), R4(n + 3*4 )
R6(0), R6(2), R6(1), R6(3)
};
unsigned int v; // reverse 32-bit value, 8 bits at time
unsigned int c; // c will get v reversed
// Option 1:
c = (BitReverseTable256[v & 0xff] << 24) |
(BitReverseTable256[(v >> 8) & 0xff] << 16) |
(BitReverseTable256[(v >> 16) & 0xff] << 8) |
(BitReverseTable256[(v >> 24) & 0xff]); |
Je manque d’expérience en C et je ne comprends pas la syntaxe de cette partie notamment :
Code:
1 2 3 4 5 6 7
| static const unsigned char BitReverseTable256[256] =
{
# define R2(n) n, n + 2*64, n + 1*64, n + 3*64
# define R4(n) R2(n), R2(n + 2*16), R2(n + 1*16), R2(n + 3*16)
# define R6(n) R4(n), R4(n + 2*4 ), R4(n + 1*4 ), R4(n + 3*4 )
R6(0), R6(2), R6(1), R6(3)
}; |
Comment je dois lire ça ? Un tableau dans lequel il y a des macros définies ? Mais combien d'éléments constituent le tableau ici à sa déclaration ?
(Je n'avais jamais vu des macros placées comme ça dans un tableau). Bref, je suis perdu au niveau de la syntaxe.
Si vous pouviez m'éclairer :)
Merci,
salutations.