3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

10進から2進変換の様々なアプローチ

Posted at

#はじめに
整数を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()等の基数変換関数を持っていますので
その他の言語であればそれを使うのが無難だと思います

3
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?