2012-02-19 13 views
-4

私はビットをよく理解しようとしています。この問題を遭遇しました。私はcharの6番目のビットを1に設定しています。実際に1に設定されているかどうかを調べようとしています。間違った答えを与えています。ビット操作

int main(int argc, char** argv) { 
    unsigned char a=0; 
    a=a | (1<<6); 
    int b=a &(1<<6); 
    cout<< b; 
    return 0; 
} 

1ではなく64の結果が得られます。なぜですか?

+5

それとも、おそらくこれを行うことができますか?あなたの心の中で、あなたは '&'は何と思いますか? –

+0

あなたは間違っています。 2^6 = 64 – UmNyobe

+0

ありがとう私のエラーを見た –

答えて

1

これは実際のところ正しく、意図された動作です。

ビットnが設定されているかどうか確認する方法は次のようである:

return (value & (1U << n)) == (1U << n); 

&行うビット単位 ANDので11111111 & 0100000001000000あります。

0

あなたは使用することができます。そうでない場合は6番目のビットが0を設定している場合

int b = (a >> 6) & 1; 

b== 1になります。

0

あなたのプログラムの期待される出力がゼロ以外の値がif式と条件演算子(&&||)で真と解釈されているので64&64が64であるので、それは多くのケースには十分だ64:

その後、
a |= (1<<6); 
if (a & (1<<6)) 
{ 
    /* this code would get executed */ 
} 

あなたはあなたの変数に64秒を持っていることによって気にしている場合、このような何かしてみてください:

bool b = (a & (1<<6)) ? true : false; 

を私は三項演算子がここで必要とされているかどうかわからないんだけど、あります何が起こっているかを非常に明確にします。なぜ、それはあなたに1を与える必要があります

bool b = a >> 6 & 1;