ここでは様々な基数の位取り法について、基礎的なことを説明します。 10進数と2進数の変換等、各基数の変換については(こちら)のリンク先を見てください。
私たちは普段、数を表記するのに「10進位取り記数法」略して「10進法」という位取り(くらいどり)記数法を使っています。
位取り(positional notation)というのは、数字の位置によって「1の位の桁」「10の位の桁」「100の位の桁」等の桁を扱うシステムのことです。
10進法では
10進法を使わなくてもちゃんと数を表すことができれば何を使っても問題ありません。 12進法や20進法が使われてる文化もあります。 現代でも時間や角度の「分」や「秒」には60進法が使われています。 12や60には約数が多いので、分割する際に便利に使われてきました。
私たちは子どもの頃からの教育で10進法を叩き込まれているため、他の位取り法を扱うときに戸惑ってしまいます。 手を動かしながらじっくり取り組み、しっかり理解していけば他の位取り法も必ず習得できます。 とりあえずは、「これまでの固定観念を取り除く頭の体操」のような感覚で取り組んでみてください。
位取り記数法の文字数に対応している数、つまり、桁の基準になる数のことを基数(radix 又は base)といいます。 基数が自然数Nである位取り記数法を「N進法」といいます。 コンピュータ関係では「2進法」「8進法」「16進法」がよく使われます。
10進法は10が基数で「束(たば)にしてまとめない1の桁」「10個を一束にまとめた、10の桁」「10の桁10個を一束にまとめた、100の桁」「100の桁10個を一束にまとめた、1000の桁」「…」を並べて数を表現します。 2進法は2が基数で「束にしてまとめない1の桁」「2個を一束にまとめた、2の桁」「2の桁2個を一束にまとめた、4の桁」「4の桁2個を一束にまとめた、8の桁」「…」を並べて数を表現します。 このような束の階段は累乗指数を使うと綺麗に表現できます。
2進法を使うのは
私たちが普段使っている数字は「アラビア数字」別名「算用数字」「インド数字」と呼ばれているもので、{ 0, 1, …, 9 } の10文字だけを使って数を表現します。
歴史的には6世紀ごろのインドで、空位を表す「0」の発見があり、「0」を含めた数の足し算や掛け算等の計算規則が確立したことによって、現在用いているような位取り記数法が成立するようになりました。 インドで確立した数字と位取り記数法は、8世紀ごろにはアラビア半島に、11世紀ごろにはヨーロッパに伝わったと言われています(参考)。 その間に数字の形の変遷がありましが、16世紀ごろのヨーロッパにおける印刷技術や活字の発達によって、現在の数字の形に固定されたと考えられます。
実は紀元前20世紀ごろ、古代バビロニアでは楔形文字で表された60進法による位取り記数法が使われていました(参考)。 60には約数が多いので分割を扱うのに便利で、その後も60進法で表された小数が古代ギリシャの数学や天文学に引き継がれます。 60進法の小数は中世のアラビアやヨーロッパの天文学にまで引き継がれましたが、60進法は九九の扱いが難し過ぎて一部の専門家しか扱えない代物でした。 また、16世紀に10進法の小数がヨーロッパのステヴィン等によって発明されたことによって60進法は使われなくなっていきます。 今でも時間や角度の扱いに60進法の名残がありますが、それ以外に60進法を使うことは滅多にありません。
アラビア数字しか使えない場合、基数が10以上になると数字の位置だけで桁を表すことができなくなり、どうしても補助的な単位や記号が必要になってしまいます。 例えば、60進法では、「分」や「秒」といった単位を補って「36分45秒」と表記したり、記号を補って「36'45''」や「36:45」などと表記したりする必要があります。
使用する文字数を増やして、1文字で表せる数を大きくすれば良いと良いと思われるかも知れませんが、やりすぎると位取り記数法のメリットがなくなってしまいます。 あまりにも1桁の数が大きくなりすぎると、数値の大きさの順番を暗記するだけでも大変です。 1文字で表せる数を大きくするにしても、誰でも順番を知っている文字を使う必要があります。
よく使われるのは、英語のアルファベット { a, b, …, z } の26文字です。 これなら世界中の殆どの人が順番を知っているので、アラビア数字10文字と組み合わせて計36文字まで使うことができます。 以下は10進法の数値と36進法の文字の対応表になりますが、わざわざ表にしなくても何となく順番が分かるのではないでしょうか?
10進法 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
36進法 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
2進法~36進法を用いて、どのように数を表したり数えたりすることができるのか? この後のプログラムを動かしてみて実感してみましょう。
まずは、桁上がり(繰り上がり)の感覚を掴んでおくと良いでしょう。 ここの装置を利用して、1つずつ数を[ + ]しながら、桁上がりの様子をじっくり観察してみてください。 [2]進法になっている基数の部分を、様々に変えてやってみましょう。 「それぞれの桁に基数N個の玉が溜まっていたら、一塊の束にして次の桁の一個の玉に置き換える」という桁上がりの作業をアニメーションで表示します。
色 | |
進法 | |
10進表記 | 0 |
上のプログラムは、様々な基数(2から36)の位取りを、桁(位)ごとに色が違う玉の数で表現するものです。 一個ずつ玉を積み上げて、桁上がりの作業をアニメーションで表示します。 操作法は以下の通りです。
[2]進法では「11...1」のような連続「1」を、[8]進法では「77...7」のような連続「7」を、[10]進法では「99...9」のような連続「9」を、[16]進法では「ff...f」のような連続「f」を、[N]進法では連続する「N-1」、を[set]して、[ + ]ボタンで数値を1つ増やしてみましょう。 連続桁上がりのアニメーションが観察できます。
[10]進法の例では、色違いの玉をそれぞれ「一円玉」「十円玉」「百円玉」「千円札」「一万円札」と考えてみてください。 普段何気なくやっている「一円玉10個で十円玉に置き換える」「十円玉10個で百円玉に置き換える」「百円玉10個で千円札に置き換える」「千円札10個で一万円札に置き換える」「…」という感覚で桁上がりを理解できます。
基数が変わっても同じように考えればよく「ある桁に基数個の玉が溜まっていたら、それを次の桁の玉に置き換える」という作業を行います。
[2]進法の例では、色違いの玉をそれぞれ「一円玉」「二円玉」「四円玉」「八円玉」「十六円玉」と考えてみてください。 「一円玉2個(2進表記10個)で二円玉に置き換える」「二円玉2個(2進表記10個)で四円玉に置き換える」「四円玉2個(2進表記10個)で八円玉に置き換える」「八円玉2個(2進表記10個)で十六円玉に置き換える」「…」という感覚で桁上がりを理解できます。
[8]進法の例では、色違いの玉をそれぞれ「一円玉」「八円玉」「六十四円玉」「五百十二円玉」「四千九十六円玉」と考えてみてください。 「一円玉8個(8進表記10個)で八円玉に置き換える」「八円玉8個(8進表記10個)で六十四円玉に置き換える」「六十四円玉8個(8進表記10個)で五百十二円玉に置き換える」「五百十二円玉8個(8進表記10個)で四千九十六円玉に置き換える」「…」という感覚で桁上がりを理解できます。
[16]進法の例では、色違いの玉をそれぞれ「一円玉」「十六円玉」「二百五十六円玉」「四千九十六円玉」「六万五千五百三十六円玉」と考えてみてください。 「一円玉16個(16進表記10個)で十六円玉に置き換える」「十六円玉16個(16進表記10個)で二百五十六円玉に置き換える」「二百五十六円玉16個(16進表記10個)で四千九十六円玉に置き換える」「四千九十六円玉16個(16進表記10個)で六万五千五百三十六円玉に置き換える」「…」という感覚で桁上がりを理解できます。
[N]進法の例では、色違いの玉をそれぞれ「一円玉」「N円玉」「N2円玉」「N3円玉」「N4円玉」と考えてみてください。 「一円玉N個(N進表記10個)でN円玉に置き換える」「N円玉N個(N進表記10個)でN2円玉に置き換える」「N2円玉N個(N進表記10個)でN3円玉に置き換える」「N3円玉N個(N進表記10個)でN4円玉に置き換える」「…」という感覚で桁上がりを理解できます。
様々な基数のN進法で、2つの数の足し算の実行を視覚化したアニメーションプログラムが(こちら)にあります。
10進法では
2進法では
8進法では
16進法では
ここでは数の読み方をカタカナで()内に書きました。
別の装置でも、桁上がりの感覚を掴むことができます。 ここの、そろばんのような装置、を利用して、1つずつ数を[ + ]しながら、数えてみてください。 [10]進法になっている基数の部分を、様々に変えてやってみましょう。
進法 色 | |||||
10進表記 | 0 |
上のプログラムは、様々な基数(2から36)の4桁の数を、4色の珠で表現するものです。 操作法は以下の通りです。
アバカス(abacus)とは古くから使われていた計算器具で、その起源は紀元前2700年ごろのメソポタミア文明に遡ると言われています。 桁の概念を具現化しており、この道具が位取り記数法の起源になっているとも考えられます。 現在の算盤(そろばん)はアバカスを原型として、それが東洋に伝わる過程で様々な改良がおこなわれたものだと考えられます。 古代ローマ帝国ではアバカスに使われていた小石の珠を calculs と呼んでいて、これが英語の計算(calculation)の語源になっています。
10桁バージョンのN進アバカスが(こちら)にあります。
別の装置でも、桁上がりの感覚を掴むことができます。 ここの時計のような装置、を利用して1つずつ数を[ + ]しながら、数えてみてください。 [12]進法になっている基数の部分を、様々に変えてやってみましょう。
進法 色 秒/tik. | ||
10進 | 0 |
上のプログラムは、様々な基数(2から36)の4桁の数を4本の針で表現する時計のような装置です。 操作法は以下の通りです。
この時計では長さと色が違う4本の針で、N進法の4桁を表現します。 ある針の1周分の数をまとめて次の針に引き継ぐという操作が、数の束をまとめて新しい桁を作るという桁上がりの操作に対応します。
通常の時計では、秒針の60秒で1分の単位に、長針の60分で1時間の単位に、短針の12時間で半日の単位になります。 複雑な時間の単位の変遷に比べると、N進法の桁の扱いは単純な仕組みであることが分かります。
ちなみに(こちら)で負の整数についての補数による表現法をしっかり学んだ後で、[all 0]から[-]で逆回転させてみましょう。 4桁の補数表現の意味をより深く知ることができます。
10桁バージョンの10針のN進法時計が(こちら)にあります。
次に基数が違う数表現の比較をします。 次のN進法比較カウンタを利用してください。 1つずつ数を増やしたり減らしたりしながら桁上がりの違いに注目して、何回も繰り返し数を数えてみましょう。
10進数 | 進数 | 進数 | 進数 |
---|---|---|---|
0 | 0 | 0 |
上のカウンタの操作法です。
以下に10進数、2進数、8進数、16進数の対応表を示します。 桁上がりを意識して、数を数えながらスクロールバーを下して適当なところまで眺めてください。 表の横に並んでる数は見た目は違いますが同じ数を表しています。 例えば10進数の11と、2進数の1011と、8進数の13と、16進数のbは同じ数を表しています。
基数を変えるにはちょっとした変換計算を行います。 この変換計算のことを基数変換といいます。 情報系の資格を取る人はどんな値でも変換計算できるようにしておくことが重要です。 (基数変換)のリンク先で手計算でのやり方を説明します。 変換計算ができるようになると、コンピュータの気持ちが分かるようになります。
Windows アクセサリの「電卓」アプリには、[表示(V)]→[プログラマ(P)]とクリックすることでプログラマ電卓を利用できます。 [10進]状態で数値を打ち込んで[2進]のラジオボタンを押せば10進数を2進数に変換できます。 答え合わせに利用すると良いでしょう。
桁数が大きな場合、いくつかの桁を塊にまとめるとすっきりします。 様々な文化による違いはありますが、大きな桁数の数を扱うときは、補助的な単位や区切り記号を使ってきました。
十進法を3桁ずつにまとめると千進法になりますが、こちらは英語を含むヨーロッパ系の言語での数の命数法によく使われています。 また、簿記や会計では3桁毎にカンマ記号で桁を区切って数値を表示することが多いです。
十進法を4桁ずつにまとめると万進法になりますが、こちらは日本語を含む漢字圏での数の命数法によく使われています。 また、現在あまり使われていませんが、4桁毎にカンマで桁を区切って数値を表示すると、日本人にとって分かりやすくなって、すぐに数値を読むことができます。
指数表記 | 3桁区切りカンマ | 英語(千進法) | 4桁区切りカンマ | 漢字(万進法) |
---|---|---|---|---|
100 | 001 | one | 0001 | 一 |
101 | 010 | ten | 0010 | 十 |
102 | 100 | hundred | 0100 | 百 |
103 | 001,000 | one thousand | 1000 | 千 |
104 | 010,000 | ten thousand | 0001,0000 | 一万 |
105 | 100,000 | hundred thousand | 0010,0000 | 十万 |
106 | 001,000,000 | one million | 0100,0000 | 百万 |
107 | 010,000,000 | ten million | 1000,0000 | 千万 |
108 | 100,000,000 | hundred million | 0001,0000,0000 | 一億 |
109 | 001,000,000,000 | one billion | 0010,0000,0000 | 十億 |
1010 | 010,000,000,000 | ten billion | 0100,0000,0000 | 百億 |
1011 | 100,000,000,000 | hundred billion | 1000,0000,0000 | 千億 |
1012 | 001,000,000,000,000 | one trillion | 0001,0000,0000,0000 | 一兆 |
同じように2進法を3桁ずつにまとめたものが8進法で、4桁ずつにまとめたものが16進法に相当します。 2進法ではすぐに桁が大きくなってしまうので、8進法や16進法で表現した方が扱いやすいことが多いです。
元の位取り | 3桁位取り | 4桁位取り |
---|---|---|
十進法 (10=101) | 千進法 (1,000=103) | 万進法 (1,0000=104) |
2進法 (2=21) | 8進法 (8=23) | 16進法 (16=24) |
以下のように空位に0を補った3桁での2進数と8進数の対応や、4桁での2進数と16進数の対応の表を作っておくと、互いの基数変換に便利です。
2進数3桁 | 8進数 | 2進数4桁 | 16進数 | |
---|---|---|---|---|
000 | 0 | 0000 | 0 | |
001 | 1 | 0001 | 1 | |
010 | 2 | 0010 | 2 | |
011 | 3 | 0011 | 3 | |
100 | 4 | 0100 | 4 | |
101 | 5 | 0101 | 5 | |
110 | 6 | 0110 | 6 | |
111 | 7 | 0111 | 7 | |
1000 | 8 | |||
1001 | 9 | |||
1010 | a | |||
1011 | b | |||
1100 | c | |||
1101 | d | |||
1110 | e | |||
1111 | f |
以下のような表を作ると、8進法と16進法の違いは、千進法と万進法の違いのようなものだと理解できます。
10進法指数 | 2進法指数 | 2進法3桁区切り | 8進法 | 2進法4桁区切り | 16進法 | 10進法 |
---|---|---|---|---|---|---|
20 | 100 | 001 | 1 | 0001 | 1 | 1 |
21 | 101 | 010 | 2 | 0010 | 2 | 2 |
22 | 1010 | 100 | 4 | 0100 | 4 | 4 |
23 | 1011 | 001 000 | 10 | 1000 | 8 | 8 |
24 | 10100 | 010 000 | 20 | 0001 0000 | 10 | 16 |
25 | 10101 | 100 000 | 40 | 0010 0000 | 20 | 32 |
26 | 10110 | 001 000 000 | 100 | 0100 0000 | 40 | 64 |
27 | 10111 | 010 000 000 | 200 | 1000 0000 | 80 | 128 |
28 | 101000 | 100 000 000 | 400 | 0001 0000 0000 | 100 | 256 |
29 | 101001 | 001 000 000 000 | 1000 | 0010 0000 0000 | 200 | 512 |
210 | 101010 | 010 000 000 000 | 2000 | 0100 0000 0000 | 400 | 1024 |
211 | 101011 | 100 000 000 000 | 4000 | 1000 0000 0000 | 800 | 2048 |
212 | 101100 | 001 000 000 000 000 | 10000 | 0001 0000 0000 0000 | 1000 | 4096 |
2進数の1桁のことを1ビット(bit:binary digit の略)と呼びます。 2進数を数桁をまとめたものを1バイト(byte)と呼びます。 byte の元々の意味は「噛む、食いつく」です。 1バイトはコンピュータが一回で処理するデータ量を表す基本単位でした。 コンピュータの黎明期では1バイトが6ビットだったり7ビットだったりしていましたが、そのうち8ビットが主流になりました。 その後処理の基本単位が16ビットや32ビットに拡張されていきましたが、8ビットで1バイトというのが世界中に広まってしまったので、現在では8ビット1バイトになっています。 8ビットで1バイトが正式に決められたのは2008年になります。 正式に決められるまでに時間がかかったので、誤解を避けるために8ビットのことを1バイトという言い方を避けて、オクテット(octet)という言い方をすることがあります。
ビット(bit)の省略表記には「小文字の b」が使われます。 バイト(Byte)の省略表記には「大文字の B」が使われます。
10進法と2進法の基数変換にはちょっとした変換計算が必要です。
ところが、2進法、8進法、16進法の基数変換には変換計算が必要ありません。
対応表を見ると分かると思いますが、2進法を3桁の塊でみれば8進法、2進法を4桁の塊で見れば16進法になります。
(これは
16進法は2桁で丁度1バイト(8ビット)になるので16進法は2桁の塊で扱うことがよくあります。 文字コードやカラーコードやコンピュータの内部メモリの表現等に使われます。
接頭辞 (prefix) とは、単語の頭にひっつけて、続く単語を修飾(説明したり、変化させたり、強調したり、限定したり)する言葉です。接頭語ともいいます。
数に関しても様々な接頭辞があります。
国際単位系(SI)では 長さの単位 m(メートル)の前に c(センチ)をつけて cm (センチメートル)とすることで、百分の一メートルを表すことになります。 メートルの単位に乗数 10-2 を掛け算した単位、つまりメートルの百分の一の単位になるということです。 この接頭辞を使うことで、大きな単位や小さな単位をスッキリと表現することになります。 主なSI接頭辞を表にすると以下のようになります。
接頭辞の名称 | 記号 | 乗数 | 乗数 | 乗数 |
---|---|---|---|---|
ヨタ (yotta) | Y | 1024 | 10008 | 1 000 000 000 000 000 000 000 000 |
ゼタ (zetta) | Z | 1021 | 10007 | 1 000 000 000 000 000 000 000 |
エクサ (exa) | E | 1018 | 10006 | 1 000 000 000 000 000 000 |
ペタ (peta) | P | 1015 | 10005 | 1 000 000 000 000 000 |
テラ (tera) | T | 1012 | 10004 | 1 000 000 000 000 |
ギガ (giga) | G | 109 | 10003 | 1 000 000 000 |
メガ (mega) | M | 106 | 10002 | 1 000 000 |
キロ (kilo) | k | 103 | 10001 | 1 000 |
ヘクト (hecto) | h | 102 | 100 | |
デカ (deca) | da | 101 | 10 | |
100 | 10000 | 1 | ||
デシ (deci) | d | 10-1 | 0.1 | |
センチ (centi) | c | 10-2 | 0.01 | |
ミリ (milli) | m | 10-3 | 1000-1 | 0.001 |
マイクロ (micro) | μ | 10-6 | 1000-2 | 0.000 001 |
ナノ (nano) | n | 10-9 | 1000-3 | 0.000 000 001 |
ピコ (pico) | p | 10-12 | 1000-4 | 0.000 000 000 001 |
フェムト (femto) | f | 10-15 | 1000-5 | 0.000 000 000 000 001 |
アト (atto) | a | 10-18 | 1000-6 | 0.000 000 000 000 000 001 |
ゼプト (zepto) | z | 10-21 | 1000-7 | 0.000 000 000 000 000 000 001 |
ヨクト (yocto) | y | 10-24 | 1000-8 | 0.000 000 000 000 000 000 000 001 |
コンピュータ関係や情報系では2進法のための2進接頭辞というものが使われます。 接頭辞は 210=1024 倍ごとに名称がつけられています。 これはSI接頭辞の1000倍に一番近い値を採用したからです。 1KB(一キロバイト)は 1024B(千二十四バイト)、1MB(一メガバイト)は 1024KB(千二十四キロバイト)、つまり 10242B = 1048576B(百四万八千五百七十六バイト)になります。 主な2進接頭辞を表にすると以下のようになります。 名称はSIと同じ名称を使います。 記号のキロに関しては大文字を用います。 同じ名称ですが、大きな単位になっていくとSIとの乖離が大きくなります。 キロでは2.4%程度2進接頭辞の方が大きいだけなのですが、ヨタになると20.9%も2進接頭辞の方が大きくなります。
接頭辞の名称 | 記号 | 乗数 | 乗数 | 乗数 |
---|---|---|---|---|
ヨタ (yotta) | Y | 280 | 10248 | 1 208 925 819 614 629 174 706 176 |
ゼタ (zetta) | Z | 270 | 10247 | 1 180 591 620 717 411 303 424 |
エクサ (exa) | E | 260 | 10246 | 1 152 921 504 606 846 976 |
ペタ (peta) | P | 250 | 10245 | 1 125 899 906 842 624 |
テラ (tera) | T | 240 | 10244 | 1 099 511 627 776 |
ギガ (giga) | G | 230 | 10243 | 1 073 741 824 |
メガ (mega) | M | 220 | 10242 | 1 048 576 |
キロ (kilo) | K | 210 | 10241 | 1 024 |
29 | 512 | |||
28 | 256 | |||
27 | 128 | |||
26 | 64 | |||
25 | 32 | |||
24 | 16 | |||
23 | 8 | |||
22 | 4 | |||
21 | 2 | |||
20 | 10240 | 1 |