マイコン系プログラムを書く上で必ず必要となる16進数の話
<10進数と2進数>
10進数
0~9までカウントして10になったら1つ桁上がりする
日常生活で使っているやつ
2進数
0,1をカウントして2になったら1つ桁上がりする
コンピュータの中身
60進数
0~59までカウントして60になったら1つ桁上がりする
60秒→1分
60分→1時間
24進数:24時間で1日
31進数:31日で1月
365進数:365日で1年
10進数と60進数の換算
20000秒を時分秒に変換する
20000=5×60^2+33×60^1+20×60^0 ※60^0=1
2時間34分56秒を秒に変換する
2×60^2+34×60^1+56×60^0=9296
これは問題なく換算できると思います。
10進数と2進数の換算
やることは60進数の場合と同じです。
167を2進数に変換
167=1×2^7+0×2^6+1×2^5+0×2^4+0×2^3+1×2^2+1×2^1+1×2^0
→10100111
01101100を10進数に変換
0×2^7+1×2^6+1×2^5+0×2^4 + 1×2^3+1×2^2+0×2^1+0×2^0=108
これも紙にでも書けば計算できると思います。
Windows標準の関数電卓を使うのも良いでしょう。
<16進数>
0~15までカウントして16になったら1つ桁上がりする
0~15を1つの文字で表すために0~9はそのまま、10~15をA~Fと表記する
0 1 2 3 4 5 6 7 8 9 A B C D E F の順に並びます。
10進数と16進数の換算
167と108を16進数に変換する
167=10×16+ 7 → (A7)
108= 6×16+12 → (6C)
3桁から2桁に変わるので通信する際のデータを減らすことができますが、
人が見て分かりにくくなります。10進数と16進数の変換はあまり大きな意味
はありません。
16進数は2進数とセットで使うことで絶大な効果を発揮します。
<2進数と10進数と16進数>
2進数を10進数と16進数に変換する
2進数:1010011101101100
10進数:42862
16進数:A76C
2進数の16bit分のデータの内1ビットだけ変化させた場合
2進数:1110011101101100
10進数:59244
16進数:E76C
10進数の値同士を比較しても何がなんだか分かりません。
16進数の値では先頭のAがEに変化しているのみです。
ここで2進数を4bitづつ分けてみます。
1010/0111/0110/1100
10(A) 7 6 12(C)
1110/0111/0110/1100
14(E) 7 6 12(C)
この様に4bitづつ分けて16進数に変換できることが分かります。
たとえば
0000100000010000
と表記した場合ぱっと見何番目が1なのか分からないと思います。
これに対して
0810
と表記するれば
・左から順に4bit分が0
・次の4bit中一番右が1
・次の4bit中一番左が1
・最後の4bitは全て0
と少しは分かりやすくなります。
また、2進数では0と1を沢山並べないといけないため、間違えて0を1つ多く入力して
0000100000010000→00001000000010000
となった場合即座に間違えに気づくことは無いでしょう。
これに対して
0810→08010
であれば桁数が増えてしまったことはすぐ気づきます。
この様に2進数を4bitづつ分かりやすく管理することができます。
ただ、A76Cならまだしも0810と書いただけではこれが10進数なのか16進数なのか
分かりません。もしかしたらA76Cは変数名かもしれません。
「お前、これぐらい分かれよ」って言われても分かりません。
もちろんコンピュータ側も分かりません。
C言語の場合入力した数字が16進数である事を示す場合先頭に「0x」を付けて
0x0810
0xA76C
の様に表記します。
一般に「0b0110」と表記するとこれは2進数であることを表しますが、C言語では
2進数を表すための表記方法が存在していないようです。
C言語で2進数を扱いたい場合は16進数で入力しましょう。