ダイナフォントストーリー

カテゴリー:連載コラム「ぬらくら」
2012/10/26

ぬらくら 第24回 二進数・八進数・十六進数

すっかり日が落ちて辺りが暗くなった家路、紅く明かりの点る我が家の窓辺、黒々とヒソリ佇む暗い家……。
古い映画ですが「幸せの黄色いハンカチ」のラストシーンでたなびく黄色いハンカチ。
家の明かりは『家に誰か居ますよ~』の、そして黄色いハンカチは主人公の妻・光枝の『あなたを待っていま~す』のしるし。
窓に明かりが点っていなければ未だ誰も帰宅していないのでしょうし、黄色いハンカチがたなびいていなければ戻って欲しくないということでしょう。
灯りが『点いている/点いていない』やハンカチが『出ている/出ていない』は、その意味を『はい/いいえ』に置き換えてみることができます。
これを一つの電球の「点灯/消灯」で表してみましょう。 電球が点灯していれば「はい(家に誰かいる)」、消灯なら「いいえ(家は留守)」、電球が点灯していれば「はい(あなたを待っています)」で消灯していれば「いいえ(戻ってくるな)」と判断できるのではないでしょうか。
約束事なのでこの逆も有りですが、話を分かりやすくするために「点灯 = はい」「消灯 = いいえ」の意味としておきましょう。
電球を丸で表し「○」を点灯「●」を消灯としましょう。
電球一個で表現できる意味は「はい」と「いいえ」です。
家の灯りなら「家に誰かいる」と「家は留守」、黄色いハンカチなら「あなたを待っています」と「戻ってくるな」のそれぞれの状態を表すことになります。
一つの電球で二つの意味を表すことができるというわけです。

(電球の状態) (表示) (意味)
1.点灯している はい(家に誰かいる/あなたを待っています)
2.消灯している いいえ(家は留守/戻ってくるな)
それでは電球を二個並べると、表現できる意味は幾つになるでしょうか?
並べて書けば次のように四通りになり、それぞれの状態の意味を約束しておけば四通りの意味を表現することになります。
仮に黄色いハンカチの枚数を電球のそれぞれの状態に対応させてみましょう。
(電球の状態) (表示) (意味)
1.二つとも消灯している ●● 0枚の黄色いハンカチ
2.右側のみ点灯している ●○ 1枚の黄色いハンカチ
3.左側のみ点灯している ○● 2枚の黄色いハンカチ
4.二つとも点灯している ○○ 3枚の黄色いハンカチ

さらに、これを  
(表示) (電球の状態) (値・意味)
1.●● 二つとも消灯しているので 0(ぜろ)
2.●○ 一桁目のみ点灯しているので 1(いち)
3.○● 二桁目のみ点灯しているので 2(に)
4.○○ 二つとも点灯しているので 3(さん)

と約束して、●に「0」を、○に「1」を当てはめて書き直すと
 
(表示) (値・意味)
1. 00 0
2. 01 1
3. 10 2
4. 11 3
となります。
1.表示は「00」から始まり(値:0)
2.一桁目の値が一つ増えると1になります(値:1)
3.一桁目に値が一つ増えると、繰り上がって二桁目が1となり、
  一桁目は0に戻ります(値:2) 4.一桁目に値が一つ増えると1になり、二桁目と合わせて3になります(値:3)
私たちが普段使っている数字は一つの桁で0から9までの十個の値を表せるので「十進数」と言います。
これまでに説明してきたのは一つの桁が0か1しか表さない数字の世界です。
これを二進数といい、桁をビット(bit)と呼びます。
上にあげた例は「2ビットの二進数」と言うことになります。
ビットは binary Digit(二進数)の略でコンピュータが扱うデータの最小単位です。
コンピュータの内部を走り回るデジタル信号は、ビットで表現される0と1をわずか数ボルトという電圧の変化で表しています。
コンピューターの心臓部であるCPU(中央演算処理装置)は、これも0と1で成り立つブール代数を実行する論理回路群によってデジタル信号で与えられるプログラムやデータを処理しています。
さて、上の例にもう2ビット追加した4ビットの二進数がどのように増えてゆくのか、対応する十進数と見比べてみましょう。
(ビット列) (十進数)
1. 0000 0
2. 0001 1
3. 0010 2
4. 0011 3
5. 0100 4
6. 0101 5
7. 0110 6
8. 0111 7
9. 1000 8
10. 1001 9
11. 1010 10
12. 1011 11
13. 1100 12
14. 1101 13
15. 1110 14
16. 1111 15
2ビット追加して4ビットにしただけで、表すことができる値が4倍の16通り(0から15)になりました。
この4ビットの二進数をよく見ると次のようなことがわかります。
一番右のビットから数えて、
1ビット目(1桁目)のみがオン:値は 1
2ビット目(2桁目)のみがオン:値は 2
3ビット目(3桁目)のみがオン:値は 4
4ビット目(4桁目)のみがオン:値は 8

というように、
左側のビットはその右側のビットの二倍の値になっていることが分かります。
さらにビット数を増やした8ビットによる二進数では8ビット目が128の値を表し、全てのビットが1になると255という値を表していることになります。
これに0表示を加えた256通りが8ビットで表せる値になります。
以下の表は8ビットのビット列と十進数の関係を示したものです。
上記の4ビット二進数の一覧の続きだけを示してあります。
この表から抜けている十進数に対応する二進数を考えてみてください。
(ビット列) (十進数)
17.00010000 5ビット目がオン: 16
18.00100000 6ビット目がオン: 32
19.01000000 7ビット目がオン: 64
20.10000000 8ビット目がオン:128

さて、それでは次の二つの8ビットの二進数を比べてどちらが大きな値なのか直ぐに分かりますか?
11010110    11011010
コンピューターには苦もなく判断できる二進数も、人がこれを直感的に判断するのは難しいことです。そこでこの二進数を人間にも分かりやすく表記する方法として八進数が工夫されました。
まず、ビット列を右から3ビットずつ区切って、それぞれの区切りを以下のように十進数に直します。
11 010 110 11 011 010
3 2 6 3 3 2
326 332
これならどちらが大きな数値なのか一目で判断することができます。
ビット列を右から3ビットずつ区切って十進表記したこの326や332を8進数と言います。
これを読むときはそれぞれ『サン・ニ・ロク』『サン・サン・ニ』とそれぞれの桁を粒読みします。
8進数では一つの桁に0から7まで入り、8になると一桁繰り上がります。
ビット列と八進数の関係は以下のようになります。
ビット列は3ビットで区切って見やすくしました。
八進数の10以降はランダムに取り上げた数値です。
(ビット列) (八進数)
1.00 000 000 000
2.00 000 001 001
3.00 000 010 002
4.00 000 011 003
5.00 000 100 004
6.00 000 101 005
7.00 000 110 006
8.00 000 111 007
9.00 001 000 010
10.00 010 001 021
11.00 011 010 032
12.00 100 011 043
13.00 101 100 054
14.00 110 101 065
15.00 111 110 076
16.00 111 111 077
17.01 001 001 111
18.11 111 111 377

八進数をもう一段進めた表記方法が十六進数です。
八進数は3ビットずつを一区切りにしましたが、十六進数は4ビット一区切りのビット列を一桁として、そこで0から15までの16通りの値を表します。
私たちが普段使っているアラビア数字は一桁に表記できる数字が0から9までしかなく、十六進数の10から15までを表記することができません。
そこで10から15までにアルファベットのAからFまでを当てはめて、10 は A、11 は B、12 は C、13 は D、14 は E、15 は Fと表記します。
ビット列と十六進数の関係は以下のようになります。
ビット列は4ビットずつ区切って見やすくしました。
十六進数の10以降はランダムに取り上げた値です。
(ビット列) (十六進数)
1. 0000 0000 00
2. 0000 0001 01
3. 0000 0010 02
4. 0000 0011 03
5. 0000 0100 04
6. 0000 0101 05
7. 0000 0110 06
8. 0000 0111 07
9. 0000 1000 08
10. 0000 1001 09
11. 0000 1010 0A
12. 0000 1011 0B
13. 0000 1100 0C
14. 0000 1101 0D
15. 0000 1110 0E
16. 0000 1111 0F
17. 0001 0000 10
18. 0010 0111 27
19. 0101 1010 5A
20. 1001 1101 9D
21. 1101 1110 DE
22. 1111 1111 FF

今度は次の数値をみてください。
1.101  2.376  3.83  4.91C
これらの数値を見ただけでは十進数なのか二進数なのか、はたまた八進数なのかが分かりません。
そこでこれらの数値を( )でくくり、さらに括弧の右下に小さく二進数は2、八進数は8、十進数は10、十六進数は16と付記して以下のように記述し、一目でそれと分かるようにします
(括弧右側の数字は本来は小さく表記するのですが、ここでは表示することができないので、他の数字と同じ大きさで表示ししています)。
1.(101)2  2.(376)8  3.(83)10  4.(91C)16
用途によっては次のような方法で区別することもあります。
二進数:数字の後ろにBをつける。
八進数:数字の後ろにO(オー)またはQをつける。
十進数:何もつけない。区別するときは数字の後ろにDをつける。
十六進数:数字の後ろにH、あるいは数字の前に0x、x、&h、$のいずれかをつける。
1.101B  2.376Q  3.83D
4.91CH、0x91C、x91C、&h91C、$91C
以上、駆け足で日常の生活からはなじみの薄い二進数、八進数、十六進数をみてきました。
12個で1ダース、12ダースで1グロス、これは十二進数、60秒で1分、60分で1時間、これは60進数など、探せばまだまだ十進数以外の数の世界がありそうです。


 
タイトルの「ぬらくら」ですが、「ぬらりくらり」続けていこうと思いつけました。
ぬらくらは、ダイナフォント News Letter(ダイナコムウェア メールマガジン)にて連載中です。
いち早く最新コラムを読みたい方は、メールマガジン登録(Web会員登録)をお願いいたします。
メルマガ登録はこちら

  著者 Information

著者
ダイナコムウェア コンサルタント
mk88氏

PROFILE●1942年東京都生まれ。
1966年桑沢デザイン研究所ビジュアルデザイン科卒。
設備機器メーカー、新聞社、広告会社を経て、
総合印刷会社にてDTP黎明期の多言語処理・印刷ワークフローの構築に参加。
1998年よりダイナコムウェア株式会社に勤務。
Web印刷サービス・デジタルドキュメント管理ツール・電子書籍用フォント開発・
フォントライセンスの営業・中国文字コード規格GB18030の国内普及窓口等を歴任。
現在はコンサルタントとして辣腕を振るう。
Blog:mk88の独り言