二進法

二進法（にしんほう）とは、二 を底（てい、基（base）とも）として、底の冪の和で数を表現する方法である。 英語でバイナリ (binary) というが、これはラテン語「binarius」に由来する語で、「binary」と「binarius」は本来「二個一組」「二つから成る」を意味する語である（用例：バイナリ空間分割）。 二を底とする位取り記数法を二進記数法と呼ぶ。混乱を防ぐために二進法であることを示す場合には、下付の 2 を用いて (110)2 などとすることがある。二進記数法で a N a N − 1 … a 1 a 0 . a − 1 a − 2 … {\displaystyle a_{N}a_{N-1}\ldots a_{1}a_{0}.a_{-1}a_{-2}\ldots } （各位の値 ai は 0 か 1）と表される数は二進法の定義から、 a N 2 N + a N − 1 2 N − 1 + ⋯ + a 1 2 + a 0 + a − 1 2 + a − 2 2 2 + ⋯ {\displaystyle a_{N}2^{N}+a_{N-1}2^{N-1}+\cdots +a_{1}2+a_{0}+{a_{-1} \over 2}+{a_{-2} \over 2^{2}}+\cdots } という数を表している（ここで 2 は十進法の 2 である）。 「二進記数法で記された数」という意味として二進数という語が使われることがある。しかし、二進数という数の体系（例えば「整数」といったような）があるわけではない。また、p進数における p = 2 の場合とは全く異なる。 二進法を用いれば 0 と 1 の二種類の数字のみで零を含む任意の自然数が表現可能であり、負号と合わせることで整数が表現可能である。更に小数点を合わせて 4 種類の記号のみで実数の表現が可能である。別の言い方をすると、「もし数字が 0 と 1 しか無かったら」を実現した方法が二進法である。 「数字が0と1しか無い」と、二倍を繰り返す度に桁が増えるので、桁の繰り上がりは「桁外れ」と呼べるほど速い。二倍の繰り返し＝二の冪数で桁が繰り上がるので、「1に0が六つ付く＝七桁に突入する」数は、二進法は六十四だが、その次の三進法は七百二十九であり、三進法より十一倍速い。二と三の積を底にする六進法が三桁に突入する（1に0が二つ付く）数は三十六、十進法が三桁に突入する数は百、十二進法が三桁に突入する数は百四十四だが、二進法は百四十四にも満たない百二十八で八桁に突入する（1に0が七個付く）。 そして、二進法では四千九十六で十三桁に突入する（1に0が十二個付く）速さで、以後は六進法が七桁に突入する時点で、十進法は46656、十二進法は23000で五桁に過ぎないが、二進法は十六桁に突入している。そして、十進法が七桁に突入する時点で、六進法が八桁に対して、二進法は二十桁に突入している。十二進法が七桁に突入する時点で、二進法は二十二桁にまで膨らんでいる。 また、百四十四は「128 + 16」で「27 + 24」に分解でき、三十六は「32 + 4」で「25 + 22」に分解できる。従って、十進法の「144÷4 = 36」は、以下のような表記になる。 十二進法：100 ÷ 4 = 30 十進法：144 ÷ 4 = 36 六進法：400 ÷ 4 = 100 二進法：10010000 ÷ 100 = 100100 更に、二進法は因数が2だけなので、1/3や1/5といった奇数分割ができない。二進表記で、1/3は 1÷(11)2 = 0.0101…となり、1/5も 1÷(101)2 = 0.0011…の無限小数になる。偶数でも、六や十といった「奇数で割り切れる偶数」では1を割り切れない。単位分数は、二の冪数を除いて全て割り切れない無限小数になる。 ※ 位数と桁数は十進表記。桁は六つごとに区切る。 電子式コンピュータの電子回路などのディジタル回路（ディジタル論理回路）、磁気ディスク等の記憶メディアでは、電圧の高低、磁極の N/S など、物理現象を二状態のみに縮退して扱う（離散化などと言う）ので、それに、真と偽の2つの値（2値の真理値）のみを使用する二値論理（しばしば、電子的には H と L、論理的には T と F という記号が使われる）をマッピングする。更にそこで数値を扱うには、それに二進法をマッピングするのが最適である。 もし、六進法を用いようとすると六種類（2×3）の状態が、十進法を用いようとすると十種類（2×5）の状態が、十二進法を用いようとすると十二種類（22×3）の状態が必要となるが、それだと二の冪数ではないので都合が悪い。二進化十進表現を用いたり、電卓やIBM の POWER のように十進法による直接演算機能を持つコンピュータもあるが、回路としては二値方式（二値論理方式）である。 多くの応用で見られるように桁数が有限の場合は、数学的に言うなら「有理数の部分集合」が表現されているわけであるが、通常は「有限精度の実数」が表現されている（数学的には、それはもはや実数ではないが）と解釈される。 2種類の記号のみで、負の範囲の値（負の範囲の整数）も扱うには、広く一般的に用いられている方法は、最上位ビット（MSB）の重みを、2Nではなく −(2N) であるとするものである（2の補数を参照）。この方法は、そのビットパターンが、加減(及び、乗)の演算において特別な処理が不要なものになる、という特長を持つ。ただし、溢れ（オーバーフロー）の扱いが違ってくる（これは、例えばx86プロセッサにおける、キャリーフラグとオーバフローフラグの違いのことである（ステータスレジスタ#キャリーとオーバーフローを参照））。また固定長の場合に表現可能な範囲が、最小の値（負の側の絶対値が最大の値）のほうにひとつはみ出している、という扱いが面倒な場合がある特徴があって、たとえば8ビットで表現可能な範囲は −128, −127, 〜 −2, −1, 0, 1, 〜 126, 127 というようになっている。これに関しては、例えばC言語の標準規格のように、他の表現法も考慮し、全ての符号付き固定長のデータ型は、signed char であれば −128 までではなく −127 まで、などといった仕様になっている、といった場合がある。 「十進法から二進法への変換方法」などといったものを考える必要はない。どちらも数の「表現法」に過ぎないのだから、単に「表現法 → 数 → 表現法」といったようにして変換すれば良いのである。 二進命数法とは、2 を底とする命数法である。真の二進命数法では、二の冪数（2n）に対応する数詞があり、数はそれらの和で表される。自然言語では、このような命数法はパプアニューギニアのメルパ語 (Melpa) でのみ知られている。 通常、二進法の数詞を持つとされるものは二つ組で数える体系であり、乗算が含まれないため、真の二進法ではない。以下にパプアニューギニアの南キワイ語 (Southern Kiwai) およびシッサノ語 (Sissano) の数詞を示す。 「パイント」「クォート」「ガロン」といった単位がある帝国単位#体積（一般的ではないが、より細かくこれらの間を二進的に埋める単位もある）が、コンピュータ以前のものとしては珍しく二進的である。 中国には古くから易の八卦や六十四卦があり、それぞれ 3 ビットと 6 ビットに相当している。易経の六十四卦の配列は対応する整数の順になっていて、それらを 1→2→4→8→16→32→64 と進展させる｢加一倍の法｣を11世紀の儒学者邵雍が考案した。ただし、彼らがそれを整数（ないし、数）に対応するとして理解していたという証拠はない。その配列はそれぞれが二種類の値をとる要素の 6 タプルを辞書式順序に並べたものと見ることもできる。 インドの学者ピンガラ (Pingala, 紀元前200年頃) は韻律を数学的に表現する方法を考案し、それが現在知られている最古の二進法の記述の一つとされている。 同様の二進法的組合せの使用は、アフリカのヨルバ人が行っていた占い Ifá にもあり、中世ヨーロッパやアフリカのジオマンシーにも見られる。2 を底とする体系はサハラ以南のアフリカでジオマンシーに長く使われていた。 1605年、フランシス・ベーコンはアルファベットの文字を2種の記号の列で表す体系を論じ、任意の無作為なテキストで微かに判別可能なフォントの変化に符号化できるとした。一般理論として彼が指摘した重要な点は、同じ方法をあらゆる物に適用できるという点であり、「2種類の異なる状態をそれらの物で表現できればよく、鐘、トランペット、光、松明、マスケット銃など同様の性質があればどんなものでもよい」とした。これをベーコンの暗号（英語版）と呼ぶ。 数学的に二進法を確立したのは17世紀のゴットフリート・ライプニッツで、"Explication de l'Arithmétique Binaire" という論文も発表している。ライプニッツは現代の二進法と同じく、1 と 0 を使って二進法を表した。ライプニッツは中国愛好家でもあり、後に「易経」を知って、その六十四卦に 000000 から 111111 を対応させ、彼の賞賛してきた中国の哲学的数学の偉大な成果の証拠だとした。 1800年代中頃、イギリスの数学者ジョージ・ブールがブール代数（ブール論理）により、二進的な数（ここで言う「数」は、数学的な広義の意味であり、普通の二進法の対象である、数値という意味ではない）の代数による命題論理の形式化を示した。 1936-1937年の中嶋章と榛沢正男による「継電器回路に於ける単部分路の等価変換の理論」、1937年のクロード・シャノンによる "A Symbolic Analysis of Relay and Switching Circuits" により相次いで、リレーのようなスイッチング素子による回路（ディジタル回路）の設計がブール代数によって行えることが示され、1940年代に始まり今日まで続くコンピュータの理論の基礎のひとつとなっている。 ^ 量子化とも言うが、量子物理におけるいわゆる量子のような意味（重ね合わせ状態など）ではない。 ^ Gordon, Raymond G., Jr., ed. (2005), “Melpa”, Ethnologue: Languages of the World (15 ed.), http://www.ethnologue.com/show_language.asp?code=med 2008年3月12日閲覧。  ^ a b Lean, Glendon Angove (1992). “TALLIES AND 2-CYCLE SYSTEMS”. Counting Systems of Papua New Guinea and Oceania. Ph.D. thesis, Papua New Guinea University of Technology. オリジナルの2007年9月5日時点によるアーカイブ。. https://web.archive.org/web/20160304132322/http://www.uog.ac.pg/glec/thesis/ch2web/ch2.htm.  ^ Gordon, Raymond G., Jr., ed. (2005), “Kiwai, Southern”, Ethnologue: Languages of the World (15 ed.), http://www.ethnologue.com/show_language.asp?code=kjd 2008年3月12日閲覧。  ^ Gordon, Raymond G., Jr., ed. (2005), “Sissano”, Ethnologue: Languages of the World (15 ed.), http://www.ethnologue.com/show_language.asp?code=sso 2008年3月12日閲覧。  ^ Sanchez, Julio; Canton, Maria P. (2007), Microcontroller programming : the microchip PIC, Boca Raton, Florida: CRC Press, p. 37, ISBN 0-8493-7189-9  ^ W. S. Anglin and J. Lambek, The Heritage of Thales, Springer, 1995, ISBN 0-387-94544-X ^ Bacon, Francis, The Advancement of Learning, 6, London, pp. Chapter 1, http://home.hiwaay.net/~paul/bacon/advancement/book6ch1.html  ^ Aiton, Eric J. (1985), Leibniz: A Biography, Taylor & Francis, pp. 245–8, ISBN 0-85274-470-6  位取り記数法 広義の記数法 コンピュータの数値表現 2の冪 2進接頭辞 二進指数え法 誤った二分法 整数型 符号付数値表現 2の補数 小数の表現 固定小数点数 浮動小数点数 二進化十進表現 パック10進数 アンパック10進数 3増し符号 カウンタ (電子回路) グレイコード 除算 (デジタル) 八進法 十六進法 三進法 九進法