我正在为我们的C编程课程分配创建一个基于控制台的小游戏,我决定通过添加文本颜色和文本背景使其更具代表性和独特性。
当我在寻找解决方案时,我发现这个方便的功能将按照我想要的方式完成我的项目,但问题是这部分我不明白:
WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
其中,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;
}
答案 0 :(得分:4)
ForgC
和BackC
是两个值,实际上只能扩展为每个占4位(您可以告诉它,因为它们bitwise ANDed与0x0F
,它会清除除第一个操作数的最后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)
如果取每个BackC
和ForgC
的低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。如果BackC
为0b......abcd
且ForgC
为0b.....efgh
(均为二进制表示),则您将获得值0xabcdefgh
。