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