プロが教えるわが家の防犯対策術!

この問題の解き方がわからないので
教えて下さい…お願いします。
解説していただければ嬉しいです

2進数から16進数の問題の一問と
16進数を10進数の問題
両方一問ずつ教えて下さい
お願いしますm(_ _)m。

「電子情報技術 進数の問題」の質問画像

A 回答 (4件)

私が解く時は、手の指に1本ずつ数字を割り振って計算してしまいますが…


(1、2、4、8…と割り振っていくと、10本の指で10ビット分の計算ができます。ちなみに2の10乗は1024、言い換えると10ビット分で1kなので、桁数が増えても単位をM(メガ)、G(ギガ)と切り替えるだけで、値の概算程度なら結構楽にできます)

というのは置いておいて。
2進数の4桁(4ビット)分が、16進数の1文字分(0x0~0xF)、10進数の0~15
というのを意識すると計算しやすいと思います。
(なので、この問題も2進数は4桁ずつスペースを空けてありますよね?)

この区切りを超えた場合は、1つの区切りで表現可能な最大の値+1(2進数の4桁分なら、10進数の16)をかけて行きます。

小数点から下は、1/(最小桁で表せる数字)、2進数なら1/2…という感じなので、10進数に変換する場合は、地道に各桁の数字を計算していくか、ある程度の桁数(4桁とか)を小数点以上の数字として計算した後、まとめてその桁数分の割り算をしてしまいます(シフト演算みたいなものですね)。
今回は、2進数から16進数なので、計算はもっと楽で、2進数を4桁ずつ区切れるように0を書き加えてあげれば、ほぼ完成です。

桁数が増えてもやる事は変わらないので、桁数が少なめのものを。
※32bit演算と仮定して、マイナスの値(表現可能な最上位桁が1)ではないものとしています
小数点以下は、(特に10進数に変換する場合) 桁を間違えやすいので要注意。

2進数から16進数に変換する問題の(2)
(110.01)2
(0110.0100)2 と書き換えて、
(0110)2 = (4 + 2)10 = (6)16、
(0100)2 = (4)10 = (4)16、
まとめると、(110.01)2 = (6.4)16 になります。

16進数から10進数に変換する問題の(2)
(D.C)16
(D)16 = (13)10 ※
(C)16 = (12)10 = (8 + 4)10 = (1100)2

(C)16は、小数点以下1桁目なので、1/16をかけて、(12/16)10 = (0.75)10
もしくは
ビット単位(2進数)に分解して、
(0.1)2 = (1/2)10
(0.01)2 = (1/4)10
(0.11)2 = (1/2)10 + (1/4)10 = (0.5)10 + (0.25)10 = (0.75)10

まとめると、(D.C)16 = (13.75)10

補足:※の所は、16進数から2進数への変換といった問題では、
16進数の1桁分 = 2進数の4桁分 = 10進数で1、2、4、8 の大きい方から順に、
計算対象の数字を超えていなければ使うという感じで処理して行きます。
(13 >= 8) なので 8
(13 - 8) = 5
(5 >= 4) なので 4
(5 - 4) = 1
(1 >= 2) ではないので、2はスキップ
(1 >= 1) なので1
まとめると、(13)10 = (8 + 4 + 1)10 = (1101)2


桁数が多い場合
2進数から16進数に変換する問題の(4)
2進数が4桁ごとに切ってあるので、16進数で1文字ずつ書き換えて行くだけです。
(101 1010.1111)2
(101)2 = (4 + 1)10 = (5)10 = (5)16
(1010)2 = (8 + 2)10 = (10)10 = (A)16
(1111)2 = (F)16
まとめると、(101 1010.1111)2 = (5A.F)16

16進数から10進数に変換する問題の(1)
(50.8)16
(5)16 = (5)10
これを16倍して、(80)10

(0)16 = (0)10
これを1倍して、(0)10

(8)16 = (8)10
これを1/16倍して、(8/16)10 = (0.5)10

まとめると、(50.8)16 = (80.5)10


実際は、16進数の2文字ずつ (0x00~0xFF)、10進数の0~255 、言い換えると1バイトを1つの単位として (もしくは32ビット分 = 4バイトをまとめて) 扱うことがほとんどなので、あくまで試験問題用かな…という感じもしますが、そのうちきっと慣れます。

検算は、オンラインの計算ツールなどで。
https://note.cman.jp/convert/bit/
桁数合わせの欄の設定を忘れずに。(10進数でマイナスの値になった場合などは、大抵忘れてます)
もしくは、桁数は自動で、符号なしに設定しましょう。(今回の問題の場合)

一応結果は確認しましたが・・・計算間違いやtypo等ありませんように。
    • good
    • 0

たとえば「2進数:abcdefghjklm」は


 a * 2^11 + b * 2^10 + c * 2^9 + d * 2^8 + e * 2^7 + f * 2^6 + g * 2^5 + h * 2^4 + j * 2^3 + k * 2^2 + L * 2^1 + m * 2^0
だということが分かりますか?
小数点以下は 2^(-1), 2^(-2), 2^(-3), ・・・ と続きます。

使い慣れた「10進数」であれば、「2^〇」の部分が「10^〇」になります。それが「N進数」の意味です。(「N^〇」になるということ)

では、これを「16進数」に変換すれば

 (a * 2^3 + b * 2^2 + c * 2^1 + d * 2^0) * 2^8 + (e * 2^3 + f * 2^2 + g * 2^1 + h * 2^0) * 2^4 + (j * 2^3 + k * 2^2 + L * 2^1 + m * 2^0) * 2^0
= (a * 2^3 + b * 2^2 + c * 2^1 + d * 2^0) * 16^2 + (e * 2^3 + f * 2^2 + g * 2^1 + h * 2^0) * 16^1 + (j * 2^3 + k * 2^2 + L * 2^1 + m * 2^0) * 16^0

と単純に変換できることが分かりますか?
「16進数:ABC」とすれば
 A = a * 2^3 + b * 2^2 + c * 2^1 + d * 2^0
 B = e * 2^3 + f * 2^2 + g * 2^1 + h * 2^0
 C = j * 2^3 + k * 2^2 + L * 2^1 + m * 2^0
ということです。
つまり、「2進数」を、小数点位置から上および下に「4桁ずつ」区切って、その「4桁の2進数」を「1桁の16進数」に置き換えていけばよいのです。

これは「16 = 2^4」という関係にあるからできる話で、そうでない一般の場合にはいちいち各桁の数値を計算していく必要があります。

3. 上を使えば、16進数の「1桁」を [aaaa](a は2進数の0か1)で表して

(1)
(1100.0011)(2) = [1100](16).[0011](16) = (C.3)(16)

(2)
(110.01)(2) = [0110](16).[0100](16) = (6.8)(16)

(3)
(1 1101.11)(2) = [0001][1101](16).[1100](16) = (1D.C)(16)

(4)
(101 1010.1111)(2) = [0101][1010](16).[1111](16) = (5A.F)(16)

(5)
(1010 1100.111)(2) = [1010][1100](16).[1110](16) = (AC.E)(16)

4(1)
「10進数」に変換するには、16進数を上の定義通りに書き出して、
(50.8)(16) = 5 * 16^1 + 0 * 16^0 + 8 * 16^(-1)
= 5 *16 + 0 + 8 * (1/16)
= 80 + 1/2
= 80.5
です。

(余談)
これを例えば「8進数」にしたいのなら、
 A * 8^2 + B * 8^1 + C * 8^0 + D * 8^(-1) + E * 8^(-2) + ・・・
= A * 64 + B * 8 + C + D * (1/8) + E * (1/64) + ・・・
= 80.5
とすれば、
 A=1
はすぐに決まります。
そうすると残りは
 80.5 - 64 = 16.5
ですから、
 B=2
になります。
そうすると残りは
 16.5 - 2 * 8 = 0.5
ですから、
 C=0
だとわかります。
そうすると、
 D=4
でちょうど
 4 * (1/8) = 1/2
となって、「10進数の 80.5」がすべて「8進数の数」で表せたことになります。

つまり
 (80.5)(10) = (120.4)(8)
ということです。

これは 「16進数」を一度「2進数」に置き換え(上の逆手順です)
 (50.8)(16) = [5][0].[8](16) = (0101 0000.1000)(2)
これを 8 = 2^3 進数にするので、小数点位置から3桁ずつで区切って、それぞれを「8進の1桁」とすれば
 (0101 0000.1000)(2) = (001 010 000.100 000))2
= [001][010][000].[100](2)
= (120.4)(16)
と簡単に変換できます。
「2進数」「8進数」「16進数」(あまり使いませんが「4進数」も)は、このように簡単に変換できます。


(2)同様に
 (D.C)(16) = D * 16^0 + C * 16^(-1) = 13 * 1 + 12 * (1/16)
= 13 + 3/4
= 13.75
    • good
    • 0

3の(1)と4の(1)を回答します。


なお、2進数を&B()、16進数を&H()と表記します。

3の(1):
2進数→10進数変換
&B(1100.0011)→
1×2^3 + 1×2^2 + 0×2^1 + 0×2^0 + 0×2^(-1) + 0×2^(-2) + 1×2^(-3) + 0×2^(-4)
=8+4+(1/8)+(1/16)
=12+(3/16)

10進数→16進数変換
12→&H(C)
3/16=3×16^(-1)→&H(0.3)

よって、&B(1100.0011)→&H(C.3)

4の(1):
16進数→10進数変換
&H(50.8)→
5×16^1 + 0×16^0 + 8×16^(-1)
=80+(8/16)
=80.5

よって、&H(50.8)→80.5
    • good
    • 0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!