- ベストアンサー
ビットを操作する。
if( b&a )の所、 45678 & 32768 が二進数でANDされると思いますが if( b&a )内で具体的にどんな計算されるのか教えてください。 unsigned a; unsigned short b = 45678; for(a=32768; a>0; a=a/2) if( b&a ) printf("1 "); else printf("0 ");
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
このプログラムでは、結論から言えば、b を2進数表記したものが表示されます。 ポイントになるのは、 a = 32768; からスタートしているところですね。 これは、2進数表記で、 1000000000000000(2) になります。 2進数の AND は大丈夫でしょうか? 1 & 0 = 0 & 1 = 0 & 0 = 1 1 & 1 = 1 なので、1000000000000000(2) で and をとると、下の7桁は必ず0になります。 先頭の一桁だけ、b が(2進数表記で) 1 の場合だけ 1 になります。 つまり、1000000000000000(2) で and をとると、b の最上位が 1 の時は、if() の中身が、0でなくなり、"1 " が表示されます。 b の最上位が 0 の時は、if() の中身が0ですから、"0 " が表示されます。 さて、次のループで、a は、 1/2にされます。 例えば、1000(10) を 1/10 すると、100(10) と一桁少なくなります。 同じように、2進数表記のものを 1/2 すると、(2進数で)一桁少なくなります。 つまり、 1000000000000000(2) だったのが、 0100000000000000(2) になります(先頭のゼロはなくても良いですが、桁をそろえるために) この数値で and をとると b を2進数表記したときの上から2桁目が 1 か 0 かがわかります。 以下、a を順次 1/2 する = 一桁ずつずらして、b のそれぞれの桁を見ているわけです。
その他の回答 (5)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★まとめ。 ・もうたくさんの回答者さんからアドバイスや回答があるのでまとめてみました。 ・『45678』の数値を『a』という変数で上位の方から順番に2進表記で出力するって事ですよ。 ・2進数で AND を取るため、上位から順番にビットが 1(ON) なら printf("1 "); と表示して ビットが 0(OFF) なら printf("0 "); と表示しているだけですよ。 ・結論、if( b & a ) の部分はビットの ON と OFF を調べているのです。 ・分かりますか?『45678』や『32768』を2進数に置き換えて紙に書いてみると良く分かりますよ。 ・短いですがこれで終わりです。さようなら。頑張って下さい。
お礼
回答ありがとうございます! 2進数は難しいので、参考になります! どうもありがとうございます!
- herbest
- ベストアンサー率42% (15/35)
unsigned short bを二進数にした内容が出力されるんですかね。 32768を2進数にすると1000000000000000です。 45678を2進数にすると1011001001101110です。 変数aを2で割るのは右に1ビットシフト(>>)したのと同じ事になるので、 変数bを左から順番にゼロかゼロ以外か見てる事になります。 1000000000000000 1011001001101110 ↓ 1000000000000000 0100000000000000 1011001001101110 ↓ 0000000000000000 0010000000000000 1011001001101110 ↓ 0010000000000000 ...中略... 0000000000000001 1011001001101110 ↓ 0000000000000000 という計算がなされています。
お礼
素早い回答ありがとうございます! 32768を2進数にすると1000000000000000です。 45678を2進数にすると1011001001101110です。 上記はとても参考になりました! どうもありがとうございます!
- venzou
- ベストアンサー率71% (311/435)
実際の変数の変化を2進数で表示してみれば理解しやすいかも。 #include <stdio.h> void printbit(unsigned short n){ unsigned short bit; for(bit = 1 << sizeof(short)*8-1; bit > 0; bit >>= 1) putchar((n & bit)?'1':'0'); putchar('\n'); } void main(void){ unsigned short a; unsigned short b = 45678; for(a=32768; a>0; a=a/2){ printf("a = ");printbit(a); printf("b = ");printbit(b); printf("a&b = ");printbit(a&b); putchar('\n'); } }
お礼
素早い回答ありがとうございます! 初心者なのでプログラムがちょっと難しそうですが、 参考にさせていただきます! どうもありがとうございました!
- Kyo99
- ベストアンサー率12% (1/8)
すいませんNo1ですがb=6の場合でした
- Kyo99
- ベストアンサー率12% (1/8)
例えば unsigned char a=10; unsigned char b=3; unsigned char c = a&b; の場合2進数表記で aが 00001010 bが 00000110 になるので cはaとbの各ビットごとのANDなので 00000010 で 10進数の2になります ゆえに if( a&b ) ⇒ if(2) でTRUEです unsigned short ならこれを16ビットで考えてみてください
お礼
素早い回答ありがとうございます! 2進数で00000000のような時でも、偽と評価されるんですネ! どうもありがとうございました!
お礼
素早い回答ありがとうございます! 解り易く教えていただきありがとうございます! イメージがつかめました。 どうもありがとうございます!