Que signifie cette expression? (Fonction SetConsoleTextAtsortingbute en C)

Je suis en train de créer un petit jeu basé sur une console pour notre tâche de classe C et j’ai décidé de le rendre plus présentable et unique en ajoutant des couleurs de texte et des arrière-plans de texte.

Pendant que je cherchais une solution, j’ai trouvé cette fonction pratique qui ferait exactement ce que je voulais pour mon projet mais le problème est qu’il ya cette partie que je ne comprends pas:

WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F); 

Où, BackC et ForgC reçoivent des entiers et le type de données WORD est juste un typedef pour un short int non signé. Plus précisément, ce que je ne comprends pas, c’est la partie ((BackC & 0x0F) << 4) + (ForgC & 0x0F) . Est-ce que quelqu’un peut m’aider avec ça? Je sais que je peux simplement utiliser la fonction mais je veux vraiment savoir comment fonctionne la fonction … Merci!

Voici le code source complet (colorExample.c)

 #include  #include  void SetColorAndBackground(int ForgC, int BackC); int main() { SetColorAndBackground(10,1); //color value range 0 up-to 256 printf("what is text background color \n"); SetColorAndBackground(11,1); printf("how about this?"); getch(); return 0; } void SetColorAndBackground(int ForgC, int BackC) { WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor); return; } 

ForgC et BackC sont deux valeurs qui ne peuvent vraiment s’étendre que sur 4 bits chacune (vous pouvez le dire car elles sont binarys au niveau du bit avec 0x0F , ce qui efface tout sauf les 4 derniers bits du premier opérande).

Donc, si nous les considérons comme des valeurs de 8 bits, elles seraient de la forme

 ForgC 0000xxxx BackC 0000yyyy 

Ensuite, vous ForgC bit par bit 4 bits vers la gauche, rendant

 ForgC xxxx0000 BackC 0000yyyy 

Et puis vous les ajoutez ensemble¹, en faisant

 ForgC xxxx0000 BackC 0000yyyy Result xxxxyyyy 

Donc, ce que cela fait en effet est de “combiner” les deux valeurs en une. SetConsoleTextAtsortingbute peut alors les séparer à nouveau ou utiliser la valeur combinée telle quelle.


¹ Techniquement, cela devrait être un OU bit à bit au lieu d’un nombre entier. Bien que dans ce cas spécifique (où les deux opérandes ont la garantie de ne pas avoir un bit dans la même position), les deux opérations produiront le même résultat, OR au niveau du bit rend l’intention plus claire.

Si prend les 4 bits inférieurs de chaque BackC et ForgC et les joint pour obtenir une valeur de 8 bits.

 (( BackC & 0x0F // take last 4 bits of BackC ) << 4) // and shift 4 to the left + ( ForgC & 0x0F // plus take last 4 bits of ForgC ) 

Par exemple, si BackC est 0b......abcd et ForgC est 0b.....efgh (les deux en représentation binary) vous obtiendrez la valeur 0xabcdefgh .