这个expression意味着什么? (C语言中的SetConsoleTextAttribute函数)

我正在创build一个基于控制台的小型游戏,为我们的C语言编程课程分配,我决定通过添加文本颜色和文本背景使其更具有代表性和独特性。

在我寻求解决scheme的过程中,我发现这个方便的函数会按我想要的方式执行,但是问题是我不明白这个部分:

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

其中, BackCForgC是整数,而数据typesWORD只是一个unsigned short int的typedef。 具体来说,我不明白的是((BackC & 0x0F) << 4) + (ForgC & 0x0F)部分。 谁能帮我这个? 我知道我可以使用该function,但我真的想知道该function是如何工作的…谢谢!

这里是完整的源代码(colorExample.c)

 #include <windows.h> #include <stdio.h> 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; } 

ForgCBackC是两个真正只能扩展到4位的值(可以这样说,因为它们正在与0x0F进行按位与运算 ,这会清除除第一个操作数的最后4位之外的所有位)。

所以,如果我们将它们看作8位宽的值,那么它们就是这种形式

 ForgC 0000xxxx BackC 0000yyyy 

然后你将ForgC 4位向左移位

 ForgC xxxx0000 BackC 0000yyyy 

然后你把它们加在一起

 ForgC xxxx0000 BackC 0000yyyy Result xxxxyyyy 

那么这样做实际上是将这两个值“合并”为一个。 SetConsoleTextAttribute可能会再次将它们分开,或者它可能会使用原来的组合值。


¹技术上这应该是一个按位或,而不是整数加法。 虽然在这个特定情况下(两个操作数保证在同一位置上没有1位),两个操作都会产生相同的结果,按位OR使得意图更清楚。

如果将每个BackCForgC的低4位加入并得到一个8位的值。

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

例如,如果BackC0b......abcdForgC0b.....efgh (二进制表示),你将得到值0xabcdefgh