我正在为我们的C编程类分配创建一个基于控制台的小型游戏,因此我决定通过添加文本颜色和文本背景使其更加美观和独特。

在寻求解决方案的过程中,我发现了这个方便的功能,可以按照我的项目所需的方式进行操作,但是问题是我不了解这部分内容:

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

其中,BackCForgC是整数,数据类型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;
}

最佳答案

ForgCBackC是两个值,它们实际上只能扩展为占用4位(您可以说出来,因为它们是0x0Fbitwise ANDed,它会清除除第一个操作数的最后4位之外的所有位)。

因此,如果我们将它们视为8位宽的值,则它们的形式为

ForgC      0000xxxx
BackC      0000yyyy

然后,您将ForgC左移4位,使得
ForgC      xxxx0000
BackC      0000yyyy

然后将它们加在一起¹,
ForgC      xxxx0000
BackC      0000yyyy
Result     xxxxyyyy

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

¹从技术上讲,这应该是bitwise OR而不是整数加法。尽管在这种特定情况下(保证两个操作数在同一位置没有1位),两个操作都将产生相同的结果,但按位OR可使意图更清晰。

08-04 15:57