2進数の求め方、10進数を2進数に変換
1.目的
- 2進数について理解する。
- 10進数を2進数に変換する方法について学習する。
目次
2. 2進数とは
・2で桁が一つ繰り上がる数字の事。
・0と1の組み合わせで表される数字。
3. 2進数と10進数の関係
・10進数は、0~9の数字で表され、9の次に10となる。
・2進数は、0~1の数字で表され、1の次に10となる。
・10進数を2進数で表すと、下記となる。
10進数 | 2進数 |
---|---|
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
13 | 1101 |
14 | 1110 |
15 | 1111 |
・・・ |
4. 2進数から10進数に変換(計算)する方法
・10進数の2桁目、3桁目と10の累乗の関係は、
10進数の1000は、10の3乗
10進数の100は、10の2乗
10進数の10は、10の1乗
10進数の1は、10の0乗
となる。
桁数と10の累乗の関係:n桁目とn乗は、同じnとなる。
・これは、2進数でも同じことがいえる。
2進数の2桁目、3桁目と2の累乗の関係は
2進数の1000は、2の3乗
2進数の100は、2の2乗
2進数の10は、2の1乗
2進数の1は、2の0乗
となる。
この関係から、2進数から10進数には下記のように求められる。
・2のn乗×(0 or 1) + 2の(n-1)乗×(0 or 1) + 2の(n-2)乗×(0 or 1) +・・2の0乗×(0 or 1)
例えば、2進数の1000を10進数にすると。
2の3乗×1 + 2の2乗×0 + 2の2乗×0 + 2の1乗×0 + 2の0乗×0
= 8+0+0+0+0
例えば、2進数の10001を10進数にすると。
2の4乗×1 + 2の3乗×0 + 2の2乗×0 + 2の2乗×0 + 2の1乗×0 + 2の0乗×1
= 16+0+0+0+0+1
=17
5. 10進数から2進数に変換(計算)する方法
10進数から2進数は、2進数から10進数にした場合の逆を考えればよい。
・10進数の整数をNとすると。
→N - (2のn乗 + 2のn-1乗 + 2のn-2乗 +・・・ 2の0乗) = 0
となる組み合わせを出す。
例えば
・10進数の18を2進数にするには。
・18 - 16(2の4乗) = 2
・2-2(2の1乗) = 0
よって、10010となる。
ただ、上記のやり方だと大変な為、下記やり方がある。
・10進数を2で割っていき、商が1となるまで、割る。
・その余りを最後から順番に並べる。
・これで2進数に変換できる。
例:
・10進数の整数が109とし、それを2進数にすると。
109/2 = 54余り1
54/2 = 27 余り 0
27/2 = 13 余り1
13/2 = 6 余り1
6/2 = 3 余り0
3/2 = 1 余り1
1/2 = 0 余り1
これを、下から並べて、1101101となっている。
この書き方をするとやりやすい。
・18をこの方法でやると。
18/2 = 9・・・0
9/2 = 4・・・1
4/2 = 2・・・0
2/2 = 1・・・0
1/2 = 0・・・1
※18を2進数では10010となる。
詳しく知りたい場合は、下記本が分かりやすい。
→ キタミ式イラストIT塾 基本情報技術者 令和04年 [ きたみりゅうじ ]
4.プログラムの作成(10進数の2進数変換)
10進数を2進数に変換するプログラム
C言語では、8進数、10進数、16進数の表示はprintfで出来るが、
2進数を表示するフォーマット指定子はない。
ここでは、10進数を2進数に変換する関数を作成する。
上記5.10進数から2進数に変換する方法から下記のようなプログラムを作成する。
10進数をNとすると、
2進数の算出は
(1) N/2の余りを算出し、格納する。
(2) N/2の値を算出する。
(3) (1)~(2)をN/2>0の間繰り返す。
(4) 格納した値を逆から表示する。
日本語だと少しわかりずらいため、フローチャートを示す。
これを元に、C言語で10進数を2進数に変更するプログラムを作成する。
・プログラム内容:
→2進数に変換し、表示する関数を作成する。
→0b1110と31を、10進数と2進数で表示する。
(0bxx は2進数を表す)
#include <stdio.h> //2進数変換関数 //引数:数値 //機能:入力した数値の2進数をprintfで出力する。 void second(int NUM) { //変数の宣言 int b[100]; //格納用の配列 int i=0; //カウント用変数 //10進数を2進数に変換 while(NUM>0){ //NUMが0より大きい間ループ b[i]=NUM%2; //NUM/2の余りをb[i]に格納 NUM/=2; //NUM/2を計算 i++; //i+1 } //2進数の値を出力 printf("2進数:"); while(i>0){ i--; //i-1 printf("%d",b[i]); //格納した値を出力 } printf("\n"); //改行 } int main(void){ //変数宣言 int A; int B; //値代入 A = 0b1110; B = 31; //10進数と2進数をそれぞれ出力 printf("10進数:A = %d\n",A); second(A); printf("10進数:B = %d\n",B); second(B); }
実行結果:https://paiza.io/projects/WCbvF5Jr80aEcT69ItzVug?language=c
関連記事
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary
・C言語基礎知識6(関数) - Project_OKI’s diary
・C言語基礎知識7(構造体1) - Project_OKI’s diary
・C言語基礎知識8(enum:列挙型) - Project_OKI’s diary
・C言語基礎知識9(typedef) - Project_OKI’s diary