我正在为我们的C编程类分配创建一个基于控制台的小型游戏,因此我决定通过添加文本颜色和文本背景使其更加美观和独特。
在寻求解决方案的过程中,我发现了这个方便的功能,可以按照我的项目所需的方式进行操作,但是问题是我不了解这部分内容:
WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
其中,
BackC
和ForgC
是整数,数据类型WORD
只是无符号short int的typedef。具体来说,我不理解的是((BackC & 0x0F) << 4) + (ForgC & 0x0F)
部分。谁能帮我这个?我知道我可以使用该功能,但我真的很想知道该功能的工作原理...谢谢!这是完整的源代码(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
的bitwise ANDed,它会清除除第一个操作数的最后4位之外的所有位)。
因此,如果我们将它们视为8位宽的值,则它们的形式为
ForgC 0000xxxx
BackC 0000yyyy
然后,您将
ForgC
左移4位,使得ForgC xxxx0000
BackC 0000yyyy
然后将它们加在一起¹,
ForgC xxxx0000
BackC 0000yyyy
Result xxxxyyyy
因此,这实际上是将两个值“组合”为一个。
SetConsoleTextAttribute
然后可能会再次将它们分开,或者可能会原样使用合并后的值。¹从技术上讲,这应该是bitwise OR而不是整数加法。尽管在这种特定情况下(保证两个操作数在同一位置没有1位),两个操作都将产生相同的结果,但按位OR可使意图更清晰。