[Optimisation C++] Calcul code altitude
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.
Code:
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;
} |
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.
Je suis toute ou�e, en vous remerciant d'avance :mrgreen: