Thinkers'Studio
JavaとC言語の自習ツール
10進→2進で表示する関数の例(汎用版とビット演算子版)

 C言語の printf変換には、10進数(%d)、8進数(%o)、16進数(%x)の書式はありますが、2進数用はありません。
 そこで今回は、10進2進で表示する関数例を示します。 汎用的に使えるものと、ビット演算子を使った2種類です。

10進 → 2進の考え方

 10進整数を 2で割っていきます。余りが下位からの各桁の値となります。
 商が 2以上の間これを繰り返します。最後の余りが最上位の桁です。

10進→2進で表示する関数のプログラム例 】
 表示桁数はどちらの関数も DIGITS に定義した値を使います。
 ここでは 8桁とし、引数もその桁数で表現可能な unsigned char とします。
 (1) 素直に書いた汎用の関数
   割る値を変えれば 8進数や 16進数用としても使えますから、これを引数 base に指定することにします。
 (2) ビット演算子を使った関数
   2で割る処理にシフト演算子 >> を使い、1 との & で各桁のビットを求めて表示します。

#include <stdio.h>
#define DIGITS 8
// --- (1) 素直に書いた汎用の関数
void cv2base( unsigned char n, int base ) {
    int i, bit[DIGITS] = { 0 };

    for( i = DIGITS-1; i >= 0 && n >= base; i-- ) {
        bit[i] = n % base;
        n /= base;
    }
    bit[i] = n;
    for( i = 0; i < DIGITS; i++ ) printf( "%d", bit[i] );
    printf( "\n" );
}
// --- (2) ビットの演算子を使った関数
void cv2bin( unsigned char n ) {
    int i;

    for( i = DIGITS-1; i >= 0; i-- ) {
        printf( "%d", ( n >> i ) & 1 );
    }
    printf( "\n" );
}
// ----------------------------------------------------
main()
{
    unsigned char n;
    for( n = 0; n < 64; n++ ) {
        printf( "%d : func(1) ", n ); cv2bin( n );
        printf( "%d : func(2) ", n ); cv2base( n, 2 );
    }
}
実行結果より
0 : func(1) 00000000
0 : func(2) 00000000
1 : func(1) 00000001
1 : func(2) 00000001
2 : func(1) 00000010
2 : func(2) 00000010
3 : func(1) 00000011
3 : func(2) 00000011
     (略)
62 : func(1) 00111110
62 : func(2) 00111110
63 : func(1) 00111111
63 : func(2) 00111111

(今回のクイズはありません)

前回の答え:合計4回 (前回の問題を見る
         (1行目) 改行だけの行        --- 1回
1234567  (2行目) ピタリと7文字?     --- 2回(7文字と最後の改行分)
a    b   (3行目) 間に4つの空白がある --- 1回(空白は関係ありません)