C言語での2進数出力関数
2010年01月09日
よくわかる! 実践Cプログラミング(日経BPパソコンベストムック)の33ページの2進数出力関数 putBinary
の動作について調べてみる。
以下が、本に掲載されている関数。
void putBinary(unsigned int x) { int i; for (i = 0; i < 32; i++, x <<= 1) putchar('0' + ((x & 0x80000000) != 0)); putchar('\n'); }
0x80000000
は一番左端のビットのみが 1
である符号無し整数。
出力対象となる x
はループが回る毎に左へ 1
ビットシフトしていく。
この両者の &
をとり、結果が 0
であれば 0
を、0
でなければ 1
を印字していく。
以下は、わかりやすくするために冗長に書いた putBinary
関数。
void putBinary(unsigned int x) { int i; unsigned int t; for (i = 0; i < 32; i++, x = x << 1) { // 0x80000000 は一番左端のビットのみが 1 である。 // x はループが回る毎に左へ 1 ビットシフトしていく。 t = x & 0x80000000; if (t != 0) { putchar('0' + 1); } else { putchar('0' + 0); } } putchar('\n'); }
以下は、ビット演算をしていくようす。
10000000000000000000000000000000 /* 0x80000000 のビット列 */ 00000000101111000110000101001110 /* 12345678 のビット列 */ /* 以下、12345678 を 左に1ビットシフトしながら 0x80000000 との & をとっていく。 */ /* & をとった結果が 0 でなければ 1 を印字する。 */ 10000000000000000000000000000000 & 00000000101111000110000101001110 => 0 10000000000000000000000000000000 & 00000001011110001100001010011100 => 0 10000000000000000000000000000000 & 00000010111100011000010100111000 => 0 10000000000000000000000000000000 & 00000010111100011000010100111000 => 0 10000000000000000000000000000000 & 00000101111000110000101001110000 => 0 10000000000000000000000000000000 & 00001011110001100001010011100000 => 0 10000000000000000000000000000000 & 00010111100011000010100111000000 => 0 10000000000000000000000000000000 & 00101111000110000101001110000000 => 0 10000000000000000000000000000000 & 01011110001100001010011100000000 => 0 10000000000000000000000000000000 & 10111100011000010100111000000000 => 1 10000000000000000000000000000000 & 01111000110000101001110000000000 => 0 10000000000000000000000000000000 & 11110001100001010011100000000000 => 1 10000000000000000000000000000000 & 11100011000010100111000000000000 => 1 /* 以下略... */