人工知性を作りたい

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

10進数→2進数、8進数、16進数変換 ーAND・OR演算子を使用!【C言語】

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

 

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

 

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

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

 皆んなと違う書き方がしたい。スマートなプログラミングがしたい。」

 

そんな方の疑問に答えます。

 

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

本記事のテーマ

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

 (AND・OR演算子を用いたスマートなプログラムを教えます) 

スマート解

16進数

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

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

2進数ーAND演算子

 続いてAND演算子を用いた2進数の変換です。 

printf("AND演算子を使用!\n");
    printf(" 2進数: ");
    for(i=128; i>0; i = i >> 1){
        printf("%d", (input & i) != 0);
    }printf("\n");
ANDとは、

AND=&:入力A、B両方が1の時、’1’を出力する。他は’0’を出力。

 

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

(input & i) != 0の説明 

C言語のAND演算では10進数同士のAND演算も2進数に変換して行ってくれる。出力は10進数。 

例:97&64

97: 01100001

 &            上下のビットでAND演算を行う

64: 01000000

出力: 01000000  となる。

つまり、

比較したいビットを’1’にしてAND演算を行う。

⇨そのビットが’1’かどうか分かる。

 これをi=128->64->32->16->8->4->2->1で比較すると2進数に変換できる。

8進数ではi=64->8->1で比較すると変換できる。

forループの説明
//i=128->64->32->16->8->4->2->1のループ
    for(i=128; i>0; i = i >> 1){
        printf("%d", (input & i) != 0);
    }printf("\n");

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

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

続いて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 <stdio.h>
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");
    printf("AND演算子を使用!\n");
    printf(" 2進数: ");
    for(i=128; i>0; i = i >> 1){
        printf("%d", (input & i) != 0);
  
    }
    printf("\n");printf("OR演算子を使用!\n");
    printf(" 2進数: ");
    for(i=128; i>0; i = i >> 1){
        printf("%d", (input | (~i)) == -1);
    }printf("\n");  
}
int main() {
    enshu0529();
    return 0;
}

 

一般解

商と余りを使った2進数変換

www.hiro877.com