人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

global navigation menu page top

【図解・実践 C言語】10進数→2進数、8進数、16進数変換 

f:id:hiro-htm877:20190601191549p:plain

 

f:id:hiro-htm877:20190601202549p:plain

 

プログラミング初心者、学生

「10進数を2進数、16進数に変換する課題が出た。

 bitって何?どうやればいいの?」

 

 

そんな方の疑問に答えるために、図を用いて分かりやすく説明しました。 

 

コードが知りたい方は目次のソースコードへ飛んでください!

本記事のテーマ

【完全初心者向け】10進数から2進数、8進数、16進数変換

 図を使ってわかりやすく伝えます。 

 

一般解

16進数

16進数はprintf関数内の’%x’で変換できます!

printf("16進数: 0x%x\n", input);

 

2進数、8進数

 続いて2進数の変換です。 

   char input;
    int i, tmp;
    printf("文字を入力してください!\n");
    scanf("%c", &input);    
    printf(" 2進数: ");
    tmp = input;    //int型にchar型を代入->int型に変換!
    //i=128->64->32->16->8->4->2->1のループ
    for(i=128; i>0; i = i >> 1){
        printf("%d", tmp/i);
        tmp %= i;
    }printf("\n");
tmp=inputの説明

char型=文字型の入力inputとint型=数の変数tmpを宣言します。

tmp=input 

でint型にchar型を代入することでtmpにint型のinput(入力した文字)が入ります。 

f:id:hiro-htm877:20190601222034j:plain

forループの説明
//i=128->64->32->16->8->4->2->1のループ
    for(i=128; i>0; i = i >> 1){    //i>>1はシフト演算(iを1/2する)
        printf("%d", tmp/i);
        tmp %= i;
    }printf("\n");

128->64->32->16->8->4->2->1のループで8ビットの2進数変換を行う。

入力(10進数)に対して、各ビットの10進数で割る。

割ることが出来たら、そのbitが1になる。これを各ビットで繰り返して2進数に変換する。

※シフト演算子は割り算より早い、2で割れる場合は出来るだけシフト演算を用いよう!

f:id:hiro-htm877:20190601223211j:plain

 

続いて8進数だが、8進数は256を3bitで表現できるので、2進数の 128->64->32->16->8->4->2->1のループを64->8->1に変えるだけで良い。

コード的には、for(i=128; i>0; i = i >> 3)

 

ソースコード

#include 
void enshu0529(){
    char input;
    int i, tmp;
    printf("文字を入力してください!\n");
    scanf("%c", &input);
    printf("10進数: %d\n", input);
    printf("16進数: 0x%x\n", input);
    printf(" 8進数: ");
    tmp = input;
    for(i=128; i>0; i = i >> 3){
        printf("%d", tmp/i);
        tmp %= i;
    } printf("\n");
    
    printf(" 2進数: ");
    tmp = input;
    for(i=128; i>0; i = i >> 1){
        printf("%d", tmp/i);
        tmp %= i;
    }
    printf("\n");
}
int main() {
    enshu0529();
    return 0;
}

 AND・OR演算子を使った2進数変換!

www.hiro877.com