我正在创build一个基于控制台的小型游戏,为我们的C语言编程课程分配,我决定通过添加文本颜色和文本背景使其更具有代表性和独特性。
在我寻求解决scheme的过程中,我发现这个方便的函数会按我想要的方式执行,但是问题是我不明白这个部分:
WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
其中, BackC
和ForgC
是整数,而数据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; }
ForgC
和BackC
是两个真正只能扩展到4位的值(可以这样说,因为它们正在与0x0F
进行按位与运算 ,这会清除除第一个操作数的最后4位之外的所有位)。
所以,如果我们将它们看作8位宽的值,那么它们就是这种形式
ForgC 0000xxxx BackC 0000yyyy
然后你将ForgC
4位向左移位
ForgC xxxx0000 BackC 0000yyyy
然后你把它们加在一起
ForgC xxxx0000 BackC 0000yyyy Result xxxxyyyy
那么这样做实际上是将这两个值“合并”为一个。 SetConsoleTextAttribute
可能会再次将它们分开,或者它可能会使用原来的组合值。
¹技术上这应该是一个按位或,而不是整数加法。 虽然在这个特定情况下(两个操作数保证在同一位置上没有1位),两个操作都会产生相同的结果,按位OR使得意图更清楚。
如果将每个BackC
和ForgC
的低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 )
例如,如果BackC
是0b......abcd
和ForgC
是0b.....efgh
(二进制表示),你将得到值0xabcdefgh
。