C言語での2進数出力関数

よくわかる! 実践Cプログラミング(日経BPパソコンベストムック)の33ページの2進数出力関数 putBinary の動作について調べてみる。

日経BPパソコンベストムック<br />よくわかる!実践Cプログラミング ★DVDつき” style=”border: none;” /></a></div>
<div class=
日経ソフトウエア
日経BP出版センター
売り上げランキング: 85799

以下が、本に掲載されている関数。

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

/* 以下略... */
«
»