皆様、こんにちわ。
U_OK_2023 です。
本日も基本情報技術者の学習内容のアウトプットになります。
基数変換
ある基数で表した数値を、別の基数表現に置き換えること
例えば、10 という数字を表す時
10進数 | 2進数 | 8進数 | 16進数 |
---|---|---|---|
10 | 1010 | 12 | A |
と表現できます。
これを、2進数 → 10進数に変換する、
逆に、10進数 → 2進数に変換する と いった操作が基数変換です。
基数変換には4つのパターンがある。
①n進数から10進数へ基数変換
②10進数からn進数への基数変換
③2進数から 8進数・16進数への基数変換
④8進数・16進数から 2進数への基数変換
①n進数から10進数へ基数変換
各桁の数字にその桁の重みを掛け算することで、10進数表記における値に変換できる。
2進数の「1101.001」という数値が10進数だといくつになるか
2進数 | 1 | 1 | 0 | 1 | . | 0 | 1 | 1 |
---|---|---|---|---|---|---|---|---|
各桁(2進数)の重み | 8 | 4 | 2 | 1 | . | 1/2(0.5) | 1/4(0.25) | 1/8(0.125) |
各桁(2進数)の数に重みをかけた数を計算 | 8 | 4 | 0 | 1 | . | 0 | 0.25 | 0.125 |
上記の結果を全て足す | 8 + | 4 + | 0 + | 1 + | . | 0 + | 0.25 + | 0.125 |
8 + 4 + 0 + 1 . 0 + 0.25 + 0.125 = 13.375
計算結果より、
2進数「1101.001」を 10進数 に 変換すると「13.375」となる。
②10進数からn進数への基数変換(10進数(13.375)を 2進数へ基数変換)
方法1:重みを使う方法
2進数の重み
・・・ 16 8 4 2 1 . 1/2(0.5) 1/4(0.25) 1/8(0.125) 1/16(0.0625) ・・・
桁の重みを使って割り算していく。
13 を 割っていくので 重みの 8 からスタートする。
13.375 ÷ 8 = 1.671・・・
13.375 - 8 = 5.375
5.375 ÷ 4 = 1.34 ・・・
5.375 - 4 = 1.375
1.375 ÷ 2 = 0.6875
1.375 - 2 = 引けないのでスライドする
1.375 ÷ 1 = 1.3745
1.375 - 1 = 0.375
.
0.375 ÷ 0.5 = 0.75
0.379 - 0.5 = 引けないのでスライド
0.375 ÷ 0.25 = 1.5
0.375 - 0.25 = 0.125
0.125 ÷ 0.125 = 1
各桁の重み | 8 | 4 | 2 | 1 | . | 1/2(0.5) | 1/4(0.25) | 1/8(0.125) |
---|---|---|---|---|---|---|---|---|
2進数 | 1 | 1 | 0 | 1 | . | 0 | 1 | 1 |
計算結果より、
10進数「13.375」を 2進数 に 変換すると「1101.011」となる。
方法2割り算と掛け算を使う方法
基数を使って
「整数部は割り算」「小数部は掛け算」する。
整数部
10進数を基数で割って、その商をまた基数で割るを繰り返す
小数部
小数部が 0 になるまで掛け算を繰り返す
10進数(13.375)整数部
13 ÷ 2 = 6 余り 1
6 ÷ 2 = 3 余り 0
3 ÷ 2 = 1 余り 1
1 ÷ 2 = 0 余り 1
.
10進数(13.375)小数部
0.375 × 2 = 0.75
0.75 × 2 = 1.5 ※ 1.5 の 1 は整数のため 次は、小数部の 0.5 を計算する
0.5 × 2 = 1.0
整数部は下から並べ直し、小数部は上から並べ直す
「1101」.「011」= 1101.011
計算結果より、
10進数「13.375」を 2進数 に 変換すると「1101.011」となる。
こちらの計算方法は、覚えてしまえば
重みを使わず手早く計算できるメリットがある。
2進数から 8進数・16進数への基数変換(2進数(1101.01)を変換)
8進数は 3ビット
16進数は 4ビット
2進数(1101.01)を 8進数へ変換
1101.01 を 3(ビット)ずつに分ける。
001 / 101 . 010 ※3桁にするためにないところは 0 を補う。
それぞれの桁に 3桁の整数部として扱い2進数の重み を 掛け算して合計する。
001 = 0 × 4 + 0 × 2 + 1 × 1 = 1
101 = 1 × 4 + 0 × 2 + 1 × 1 = 5
.
010 = 0 × 4 + 1 × 2 + 0 × 1 = 2 ※3桁の整数部として扱う
並べ直す
15.2
計算結果より、
2進数「1101.01」を 8進数 に 変換すると「15.2」となる。
③2進数(1101.01)を 16進数へ変換
1101.01 を 4(ビット)ずつに分ける。
1101.0100 ※4桁にするためにないところは 0 を補う。
それぞれの桁に 4桁の整数部として扱い2進数の重み を 掛け算して合計する。
1101 = 1 × 8 + 1 × 4 + 0 × 2 + 1 × 1 = 13
0100 = 0 × 8 + 1 × 4 + 0 × 2 + 0 × 1 = 4
並べ直す
13.4
13 は 16進数で表すと D になるので、
D.4
計算結果より、
2進数「1101.01」を 16進数 に 変換すると「D.4」となる。
④8進数・16進数から 2進数への基数変換
8進数(15.2)を 2進数へ変換
15.2 を 桁ごとに 3桁 の 2進数に分解する。※3桁にするためにないところは 0 を補う。
1 = 1 = 001
5 = 101
.
2 = 10 = 010
並べる
001 101 . 010 = 1101.01
計算結果より、
8進数「15.2」を 2進数 に 変換すると「1101.01」となる。
16進数(D.4)を 2進数へ変換
D.4 を 桁ごとに 4桁 の 2進数に分解する。※4桁にするためにないところは 0 を補う。
D = 13 = 1101
.
4 = 100 = 0100
並べる
1101 . 0100 = 1101.01
計算結果より、
16進数「D.4」を 2進数 に 変換すると「1101.01」となる。
基数変換の方法4つは以上となります。
まとめ
①n進数から10進数へ基数変換
n進数の各桁の数字に n進数の重みを掛け算する。
②10進数からn進数への基数変換
方法1:
n進数の数字を n進数の重みの数字の多い方から 1 になるまで順に割っていく。
方法2:
n(基数)を使って「整数部は割り算」「小数部は掛け算」する。
「整数部は下から」「小数部は上から」整数部を並べ直す。
③2進数から 8進数・16進数への基数変換
2進数の数字を 0 を使って ビット数(8進数なら3, 16進数なら4)に分け、
分けた数字1桁ごとにそれぞれの桁に対応する 2進数の重みで掛け算し、
整数部と小数部をそれぞれ合計し、
並べ直す。
④8進数・16進数から 2進数への基数変換
それぞれの数字を 1桁ずつ 2進数に分解し、
0 を使って ビット数(8進数なら3, 16進数なら4)の数に合わせ、
並べ直す。
アウトプットは以上になります。
ありがとうございました。