忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

2進数と16進数

マイコン系プログラムを書く上で必ず必要となる16進数の話

<10進数と2進数>

10進数
09までカウントして10になったら1つ桁上がりする
日常生活で使っているやつ

2進数
0,1をカウントして2になったら1つ桁上がりする
コンピュータの中身

60進数
059までカウントして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秒を秒に変換する
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進数に変換
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~151つの文字で表すために0~9はそのまま、10~15A~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進数の値では先頭のAEに変化しているのみです。

ここで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進数で入力しましょう。
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント