プログラミング初心者、学生
「10進数を2進数、16進数に変換する課題が出た。
皆んなと違う書き方がしたい。スマートなプログラミングがしたい。」
そんな方の疑問に答えます。
コードが知りたい方は目次のソースコードへ飛んでください!
本記事のテーマ
【完全初心者向け】10進数から2進数、8進数、16進数変換
(AND・OR演算子を用いたスマートなプログラムを教えます)
スマート解
16進数
16進数はprintf関数内の’%x’で変換できます!
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’を出力。
(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;
}