C言語の printf変換には、10進数(%d)、8進数(%o)、16進数(%x)の書式はありますが、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
(今回のクイズはありません)
(1行目) 改行だけの行 --- 1回 1234567 (2行目) ピタリと7文字? --- 2回(7文字と最後の改行分) a b (3行目) 間に4つの空白がある --- 1回(空白は関係ありません)