2011-09-24 110 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