Bonjour à tous,
Je viens de faire un bout de code calculant les codes de Gray utilisés en aviation (infos sur le codage de Gray ici, infos sur le codage "Mode C" (altitude) ici et les différents codes obtenus ici).
Peu importe si vous ne comprenez pas le but, seule m'intéresse ici la manière dont il est obtenu.N'étant pas une star du C++, je cherche à optimiser ce bout de code. Donc n'hésitez pas à vous déchaîner si vous voyez des choses qui vous choquent carrément ou qui pourraient être améliorées.
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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 unsigned short Code_Mask = 0x0FFF; unsigned short tab[1280]; unsigned short i=0; unsigned short j=0; // Parcours des 2^12 valeurs possibles pour les codes, mais on ajoute dans le tableau seulement les valeurs autorisées while(i<4096) { // Calcul du code de Gray à partir du code binaire unsigned short N = i; unsigned short N2 = (i << 1) & Code_Mask; unsigned short Gray = (N ^ N2) >> 1; bool D1 = (Gray & 0x0800); // D1 = 1? unsigned short c = (Gray & 0x0007); if((c != 0) && (c != 5) && (c != 7) && !D1) // Valeurs interdites de C + D1 doit toujours être 0 { // On obtient alors DABC tab[j] = Gray & 0x07FF; if(j<1280) j++; else break; } i++; } // Inversion des poids des bits 1 et 4 de chaque digit for(unsigned int k=0; k<1280;k++) { bool C4 = tab[k] & 0x0001; bool C1 = tab[k] & 0x0004; if(C4) tab[k] |= 0x0004; else tab[k] &= 0x0FFB; if(C1) tab[k] |= 0x0001; else tab[k] &= 0x0FFE; bool B4 = tab[k] & 0x0008; bool B1 = tab[k] & 0x0020; if(B4) tab[k] |= 0x0020; else tab[k] &= 0x0FDF; if(B1) tab[k] |= 0x0008; else tab[k] &= 0x0FF7; bool A4 = tab[k] & 0x0040; bool A1 = tab[k] & 0x0100; if(A4) tab[k] |= 0x0100; else tab[k] &= 0x0EFF; if(A1) tab[k] |= 0x0040; else tab[k] &= 0x0FBF; // Rappel : D1 doit être 0 bool D4 = tab[k] & 0x0200; if(D4) tab[k] |= 0x0800; else tab[k] &= 0x07FF; tab[k] &= 0x0DFF; } // Association de l'altitude au code correspondant // Note : tPair est une paire de deux paires de int pour les digits (A,B) et (C,D) du code d'altitude std::map<int,tPair> mapCode; int altitude = -1200; // -1200 est la première valeur d'altitude, puis évolue de 100 en 100 for(unsigned int p=0; p<1280;p++) { int A = (tab[p] & 0x01C0) >> 6; int B = (tab[p] & 0x0038) >> 3; int C = (tab[p] & 0x0007); int D = (tab[p] & 0x0E00) >> 9; mapCode.insert(std::make_pair(altitude,std::make_pair(std::make_pair(A,B),std::make_pair(C,D)))); altitude += 100; }
Je suis toute ouïe, en vous remerciant d'avance![]()
Partager