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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.