1.進数(位取り記数法)とは
数の数え方にはいろいろあります。進数を理解しましょう。
私たちが普段数を数えるときに1.2.3.4.5.6.7.8.9.10と数えますよね。なんで1.2.3.4....と数えるの?と言うと、「小さいときに教えてもらった」「この数え方があたりまえでしょう」というでしょう。
それはその通り正解!!!です。
しかし、身近な生活の場においてこの数え方が違うものがあります。
例えば、時間を数えるとき、60秒になったら1分になります。60分になったら1時間になります。24時間になったら1日になります。これは当たり前ですよね、しかし、通常使用している10までの数え方の法則にはなっていません。60分で繰り上げで単位が変わるというのは変ではないですか?
また鉛筆を数えるとき、12本で1ダースと数えます。
このように、必ずしも普段の数え方の法則ではないのもあります。実際、この数え方は小さい時から教わって無意識のうちに使っているため、変に思わないでしょうが、通常の数え方とはちょっと違います。
私たちが通常1.2.3.4.5.6.7.8.9.10と使っている数え方は10進法と言います。一桁目が10個目に達した時位が上がり、一桁目がリセット(0になる)されます。
時間の場合、デジタル表記だと0~59まで表記されるためちょっと分かりにくいですが、アナログ表記で見た場合、60秒や60分に針が来た場合、別の針が1個進み、元の針は0に戻ります。
そのため秒や分は60進数で行われており、同様に時間は24進数となります。
本来、古代の文明では時間の表記は60通りの文字があり、それを使って位を上げていたそうですが、現在は記載が非常にややこしくなるため、あえて10進表で表記しながら60進法を採用しています。
このように、「N」個目で位が上がり、下の位がリセットされる数え方を「N」進数と言います。
▲数の数え方にもいろいろあろます。
2.情報機器の内部は2進数
なぜ情報機器は2進数の世界?
通常、私たちが使用している数え方は先ほども述べたとおり10進数です。
しかし情報機器の内部は2進数で動いています。ではなぜ、2進数なのでしょうか?
2進数は電気や中央演算装置と密接な関係にあります。
ここでは2進数に関係する「単位」を使って情報機器が2進数を使用している理由を説明いたします。
1.ビット(Bit)について
ビット(Bit)というのは、中央演算装置(CPU)で1つの電気のON・OFFを出来る回路を示します。
このビット(Bit)はほとんどのデジタルコンピュータが扱うデータの最小単位となり、後の章でも詳しく説明しますが、2進数での1桁となります。
情報機器の基盤には多数のIC(集積回路)が使われています。中央演算装置(CPU)も集積回路の一種です。集積回路は電気で動きますが、電気の世界では前に説明した通り「ON」と「OFF」の世界しかありません。そのため電気の「ON」の状態を2進数で「1」、「OFF」の状態を「0」で表していま す。
電気には「電圧」というのがあるじゃないかと言う人もいると思いますが、集積回路には正確に電圧を認知できる機能がありません。また、電圧というのたえず変化しますから、電圧が変わった場合は間違ったデータになる可能性があります。そのため、確実にデータを転送するために電気の「ON」・「OFF」を使 用しているわけです。
CPUで「32Bit(ビット)」や「64Bit(ビット)」という表記がありますが、1ビットは集積回路の1本の足で1つの「ON」・「OFF」の回路になります。ですから、32BitCPUは「ON」・「OFF」の回路が32個あるということになります。
2.バイト(byte)について
1ビットは集積回路の1つの足で表せる1桁の単位というのは上記で分かったと思いますが、この1ビットを8桁まとめた単位を「Byte(バイト)」と言います。
本来、「バイト」は、欧文の1文字を表すためのビット数でありますが、昔はバイトの統一性がなく、「9ビット=1バイト」や「6ビット=1バイト」というコンピュータがありました。
しかし、IBM System/360という大型汎用機が多く市場に出回り、また1980年台に8ビットCPUを使用したマイクロコンピュータが爆発的に売れたこともあり、現在ではこの「8ビット=1バイト」というのが規格になりました。
「バイト」という単位は主に記憶容量に用いられますが、記憶容量が100バイトとした場合、情報量として欧文文字で「100文字」保存できることを表します。
3.ワード(Word)について
上記のビットやバイトという単位の他に、2進数ではワード(Word)という単位が使われます。
このワード(Word)という単位は使用する場面において、単位の定義が変わってきます。
ワードの単位の定義は3種類あります。
- 1.CPUの処理での単位(OSの定める標準サイズ)
- 1ワードは中央演算装置(CPU)が一回で処理できる単位のことを言います。32ビットCPUの場合、32ビット=4バイト(32÷8)=1ワードになり、64BitビットCPUだと64ビット=8バイト(64÷8)=1ワードとなります。
- 2.「2バイト」
- その通り2バイト=1ワードです。この単位はよく文字などの「コード体系」に使われます。
- 3.1つのアドレスのデータ量
- 具体的なバイト数はまちまちになります。これはプログラムとも関係してきますが、作成するプログラムが1アドレスが何ビットなのかによって決まります。
WindowsのVisual C++の場合、1アドレスが1ビットで扱えるため、1ワード=1ビットになります。
▲ビット(Bit)・バイト(Byte)の説明図 ビットは1つのON・OFFの回路です。
3.2進数を簡単に8進数・16進数
2進数の計算は難しくありません。
デジタル機器の中で使用されている2進数。
私たちが使用している10進数と2進数の変換は難しいように思われますが、数の数え方の方法の違いだけで、基本は一緒です。
2進数の世界はデジタル機器の世界に直結する反面、これを表記した時はとてつもない桁数を使用します。このため、これを簡略化するために「8進数」や「16進数」といった数え方に変換します。
なぜ、「8進数」や「16進数」に変換するのかというと、8や16は2の乗数であり、2進数からの変換が容易であるためです。
それでは2進数・8進数・10進数・16進数への相互変換の方法を説明いたしましょう。
10進数と2進数の相互変換
まずは8進数、16進数を覚える前に、10進数を2進数に変換する計算方法を説明いたしましょう。
10進数を2進数に変換する場合は2で割り算を行い、余りを求めます。
たとえば10進数で35の場合、
35÷2=17あまり1
17÷2=8 あまり1
8 ÷2=4 あまり0
4 ÷2=2 あまり0
2 ÷2=1 あまり0
1 ÷2=0 あまり1
この余りを最初に割った余りから順番に並べます(右から左へ)
結果、35の2進数は100011となります。
2進数から10進数に変換する場合、1が立っている桁を2の(桁-1)乗を掛けてやり、全部足していきます。
たとえば2進数で110001の場合、
2の(6-1)乗+2の(5-1)乗+2の(1-1)乗=32+16+1=49
となります。
小さい位から 1、1の2倍2、2の2倍4、4の2倍8、8の2倍16、16の2倍32、32の2倍64...と覚えたほうが簡単かもしれません。
下の表は2進数と10進数の相互表になります。
|
|
|
|
10進数 |
2進数 |
1 |
1 |
2 |
10 |
3 |
11 |
4 |
100 |
5 |
101 |
6 |
110 |
7 |
111 |
8 |
1000 |
9 |
1001 |
10 |
1010 |
11 |
1011 |
12 |
1100 |
13 |
1101 |
14 |
1110 |
15 |
1111 |
16 |
10000 |
17 |
10001 |
18 |
10010 |
19 |
10011 |
20 |
10100 |
|
10進数 |
2進数 |
21 |
10101 |
22 |
10110 |
23 |
10111 |
24 |
11000 |
25 |
11001 |
26 |
11010 |
27 |
11011 |
28 |
11100 |
29 |
11101 |
30 |
11110 |
31 |
11111 |
32 |
100000 |
33 |
100001 |
34 |
100010 |
35 |
100011 |
36 |
100100 |
37 |
100101 |
38 |
100110 |
39 |
100111 |
40 |
101000 |
|
10進数 |
2進数 |
41 |
101001 |
42 |
101010 |
43 |
101011 |
44 |
101100 |
45 |
101101 |
46 |
101110 |
47 |
101111 |
48 |
110000 |
49 |
110001 |
50 |
110010 |
51 |
110011 |
52 |
110100 |
53 |
110101 |
54 |
110110 |
55 |
110111 |
56 |
111000 |
57 |
111001 |
58 |
111010 |
59 |
111011 |
60 |
111100 |
|
|
10進数 |
2進数 |
61 |
111101 |
62 |
111110 |
63 |
111111 |
64 |
1000000 |
65 |
1000001 |
66 |
1000010 |
67 |
1000011 |
68 |
1000100 |
69 |
1000101 |
70 |
1000110 |
71 |
1000111 |
72 |
1001000 |
73 |
1001001 |
74 |
1001010 |
75 |
1001011 |
76 |
1001100 |
77 |
1001101 |
78 |
1001110 |
79 |
1001111 |
80 |
1010000 |
|
2進数と8進数の相互変換
情報機器の内部ではこのように2進数が使われていますが、2進数を扱う場合桁数が多いため情報の記載が面倒になります。そのため、2進数を8進数や16進数に変換して記載することがあります。
8進数の場合、3ビットごとに1つのブロックにします。2進数110の場合は8進数で6となります。(10進数の変換と同じ考えです。)
2進数で110111の場合、110と111で分けます。110は6、111は7となりますので、2進数110111=8進数67となります
2進数と16進数の相互変換
16進数の場合、4ビットごとに1つのブロックで分けて同様に計算しますが、10進数で10になった場合、16進数では「A」と表記します。11だと「B」というように、1、2..9、A、B、C、D、E、Fとなります。
2進数で1110と場合、10進数では14となりますが、16進数の場合は「E」となります。
2進数で11011011の場合1101=10進数13=16進数D、1011は10進数11=16進数Bとなるため11011011=16進数「DB」となります。
下の表は10進数・2進数・8進数・16進数の相互表です。
10進数 |
2進数 |
8進数 |
16進数 |
1 |
1 |
01 |
1 |
2 |
10 |
02 |
2 |
3 |
11 |
03 |
3 |
4 |
100 |
04 |
4 |
5 |
101 |
05 |
5 |
6 |
110 |
06 |
6 |
7 |
111 |
07 |
7 |
8 |
1000 |
010 |
8 |
9 |
1001 |
011 |
9 |
10 |
1010 |
012 |
A |
11 |
1011 |
013 |
B |
12 |
1100 |
014 |
C |
13 |
1101 |
015 |
D |
14 |
1110 |
016 |
E |
15 |
1111 |
017 |
F |
2進数、8進数、10進数、16進数の表記方法
2進数、8進数、10進数、16進数を区別するための表記があります。これはプログラムなどで進数表記が混在する場合によく使われます。
2進数の場合、末尾に「b」を付けて「1001b」と表記します。
8進数の場合、頭に「0(数字のゼロ)と付けて「052」と表記します
10進数の場合、末尾に「d」を付けて「95d」と表記します。
16進数の場合は、頭に「0x」を付けて「0xFF00」と表記したり、末尾に「h」を付けて「FF00h」と表記します。
なぜ8進数の頭に0を付けるのか
8進数を表記するとき、頭に「0」を付けて表記しますが、「まぎわらしい」「なぜ頭に0?」と思いませんか?
この謎を解くには、まずなぜ「8進数」を使用していたという所から始まります。
昔のコンピュータのCPUの処理のビット数は現在の「4の倍数」ではなく「3の倍数」でした。そのため12ビットや15ビット機なども数多く存在していました。
そのため昔は16ビットではなく8ビットが主流だったわけです。
プログラム上で8進数と16進数の区別を付けるために「Octal」の頭の1文字を取って「O(オー)」を付けるという案が出ました。しかし、頭に「O(オー)」が出た場合、その次は英字か数字か分かりません。先頭が「O(オー)」の単語はいくつもあります。
そこで「O(オー)」に似た「0(ゼロ)」を頭に付けよう。しかも10進数では普通は頭に「0(ゼロ)がつかないため一石二鳥となり、現在の頭に「0(ゼロ)を付けたと言われています。
最後の進数変換器を載せますので試してみてください。