2011-09-24 259 views
5

我正在为我们的C编程类作业创建基于控制台的小型游戏,并且决定通过添加文本颜色和文本背景使其更加可视化和独特。这个表达意味着什么? (C中的SetConsoleTextAttribute函数)

虽然我对我的追求寻找解决的办法,我发现这个方便的功能,将做到这我想为我的项目,但问题是,有这部分我不明白的方式:

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; 
} 
+0

http://en.wikipedia.org/wiki/Bitwise_operation – 2011-09-24 14:30:48

回答

4

ForgCBackC两个值,可以真正只扩大采取了4位每个(你可以说,是因为它们与0x0F,它会清除所有,但第一个操作数的最后4位是bitwise ANDed)。

因此,如果我们把他们看成8位宽的价值观,他们会是这样的形式

ForgC  0000xxxx 
BackC  0000yyyy 

然后你按位移位ForgC 4位到左侧,使得

ForgC  xxxx0000 
BackC  0000yyyy 

而且那么你把它们加在一起¹,使得

ForgC  xxxx0000 
BackC  0000yyyy 
Result  xxxxyyyy 

所以这实际上是“联合”机器人h值合为一。 SetConsoleTextAttribute可能会再次将它们分开,或者它可能会按原样使用组合值。


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

+0

非常感谢@Jon!这绝对是我想知道的。我从来不知道我可以在C程序中使用文字二进制文件...如果您有时间,如果您在此处输入“按位或”的版本,这将非常棒......再次感谢:) – Raven

+0

@Raven:没有什么它只是'((BackC&0x0F)<< 4)| (ForgC&0x0F)'('|'而不是'+')。 – Jon

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 
) 

例如,如果BackC0b......abcdForgC0b.....efgh(均为二进制表示形式),您将获得值0xabcdefgh

+0

谢谢你。这在技术上与上面的答案是一样的,但我选择其他的详细答案...不管怎样,我感谢你的帮助:) – Raven