2011-09-24 7 views
5

私は、Cプログラミングクラスの割り当てのためのコンソールベースの小さなゲームを作成する途中です。私は、テキストの色とテキストの背景を追加することにより、より見やすくユニークなものにすることに決めました。私は解決策を探して私の探求にあったもののこの表現は何を意味しますか? (CのSetConsoleTextAttribute関数)

、私は私のプロジェクトのために望んでいただけの方法を行います。この便利な機能を見つけたが、問題は、私は理解していないこの部分があるということです。

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

ここで、BackCForgCには整数が与えられ、データ型はWORDは単なるunsigned short intのtypedefに過ぎません。具体的には、私が理解していないのは((BackC & 0x0F) << 4) + (ForgC & 0x0F)部分です。誰もこれで私を助けることができますか?私は関数を使うことができますが、関数の仕組みを知りたいと思っています...ありがとう!各BackCForgCの下位4ビットを取り、8ビット値を得るためにそれらを結合する場合

はここで完全なソースコード(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 –

答えて

4

ForgCBackCは本当に唯一の(彼らは最初のオペランドの最後の4ビット以外のすべてをクリアした、0x0Fbitwise ANDedされているので、あなたがこれを伝えることができます)4ビットごとの取るに展開することができる2つの値です。私たちは8ビット幅の値としてそれらを見れば

だから、彼らは形式になり

ForgC  0000xxxx 
BackC  0000yyyy 

次にビット単位のシフトForgC

ForgC  xxxx0000 
BackC  0000yyyy 

を作る左に4ビット、あなたはそれらを一緒に追加しますか?

ForgC  xxxx0000 
BackC  0000yyyy 
Result  xxxxyyyy 

これは実際には "結合"ボットですh値を1に変換します。 SetConsoleTextAttributeはそれらを再び分離したり、そのまま結合した値を使用することがあります。


1これは、技術的には、整数の代わりにbitwise ORにする必要があります。この特定のケース(2つのオペランドが同じ位置に1ビットを持たないことが保証されている)では、両方の演算が同じ結果を生成しますが、ビットごとのORはインテントをより明確にします。

+0

ありがとう@ジョン!これは絶対に私が知りたいことです。私はCプログラムでリテラルバイナリを使用できることを知らなかった...時間があれば、ここで "ビットOR"バージョンを入れれば素晴らしいだろう....もう一度ありがとう: – Raven

+0

@Raven:何もないそれはちょうど '((BackC&0x0F)<< 4)| (ForgC&0x0F) '(' + 'の代わりに' | ')です。 – Jon

0

あります。

((
    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......abcdで、ForgC0b.....efgh(両方ともバイナリ表現)の場合は、0xabcdefghという値が得られます。

+0

ありがとうございます。これは技術的には上記と同じ回答ですが、私はもう一つは精巧な答えを選んでいます...とにかく、私はあなたの助けに感謝します:) – Raven

関連する問題