我正在为我们的C编程课程分配创建一个基于控制台的小游戏,我决定通过添加文本颜色和文本背景使其更具代表性和独特性.
当我在寻找解决方案时,我发现这个方便的功能将按照我想要的方式完成我的项目,但问题是这部分我不明白:
WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
where,BackC并ForgC给出整数,数据类型WORD只是unsigned 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运算,这将清除第一个操作数除最后 4 位之外的所有内容)。
因此,如果我们将它们视为 8 位宽的值,它们将具有以下形式
\n\nForgC      0000xxxx\nBackC      0000yyyy\n然后按位移位ForgC向左移动 4 位,使得
ForgC      xxxx0000\nBackC      0000yyyy\n然后将它们加在一起\xc2\xb9,使得
\n\nForgC      xxxx0000\nBackC      0000yyyy\nResult     xxxxyyyy\n因此,这实际上是将两个值“合并”为一个。SetConsoleTextAttribute然后可能会再次将它们分开,或者可能按原样使用组合值。
\xc2\xb9 从技术上讲,这应该是按位或而不是整数加法。尽管在这种特定情况下(保证两个操作数在同一位置上没有 1 位),两个操作将产生相同的结果,但按位 OR 使意图更清晰。
\n