#はじめに
整数を2進数に変換して表示する場合、
例えばC言語のprintf関数だと書式指定子だけではint型の値を2進数にフォーマット出来なかったりして苦労するかと思います
ここでは2進数に変換表示する4つのアプローチをC言語を例に紹介します
#ループさせる
全ての桁でループさせて答えを出します
##2で割っていく
sample_a.c
void print_dec2bin(int n, int digit)
{
int buf = 0;
int base = 1;
printf("0b");
while(n>0){
buf += ( n % 2 ) * base;
n /= 2;
base = base * 10;
}
printf("%d\n",buf);
return;
}
- 最も愚直な考え方,2進数を10進数ととらえて2で割っていきながら右から保存していくやり方
- 答えが入る
buf
や今の桁数base
がメモリ効率が悪いので値が溢れる危険がある -
0詰めにするためには
base
の値やbuf
の桁数を測って追加の処理を書かなければならない
##マスクを取る
sample_b.c
void print_dec2bin(int n, int digit)
{
int mask;
printf("0b");
for(mask=(0x1<<(digit-1)); mask>0; mask>>=1){
printf("%d", mask&n ? 1 : 0);
}
printf("\n");
return;
}
- 対応桁だけ1が入っている
mask
という変数でひとつづつ左から出していくよう - 最上位桁を考えないので0詰めを消すには最上桁を探す部分が必要となります
#再帰処理を行う
sample_c.c
void print_dec2bin(int n, int digit)
{
if(digit==0){
printf("0b");
}else{
print_dec2bin(n/2,digit-1);
printf("%d",n%2);
}
return;
}
- 再帰処理の最後の判定を
digit==0
からn<=0
にすれば0詰めしないようにもできます - このプログラムの問題点は上手く改行文字を挟むことができないことです
改行文字を挟みたい場合は呼び出し元の先で改行文字を出力するか
改行する関数を挟んで呼び出すしかないみたいです
#フォーマットライブラリを使う
C言語以外のたいていの言語であれば2進数に変化する"%b"やparse()
等の基数変換関数を持っていますので
その他の言語であればそれを使うのが無難だと思います