这个表达是什么意思? (C中的SetConsoleTextAttribute函数)

时间:2011-09-24 14:27:05

标签: c++ c windows

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

当我在寻找解决方案时,我发现这个方便的功能将按照我想要的方式完成我的项目,但问题是这部分我不明白:

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

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

2 个答案:

答案 0 :(得分:4)

ForgCBackC是两个值,实际上只能扩展为每个占4位(您可以告诉它,因为它们bitwise ANDed0x0F,它会清除除第一个操作数的最后4位之外的所有内容。)

因此,如果我们将它们视为8位宽的值,它们将具有

的形式
ForgC      0000xxxx
BackC      0000yyyy

然后你向左移位ForgC 4位,制作

ForgC      xxxx0000
BackC      0000yyyy

然后你把它们加在一起¹,制作

ForgC      xxxx0000
BackC      0000yyyy
Result     xxxxyyyy

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


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

答案 1 :(得分:0)

如果取每个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
 )

E.g。如果BackC0b......abcdForgC0b.....efgh(均为二进制表示),则您将获得值0xabcdefgh