十六進法
十六進法(じゅうろくしんほう、 hexadecimal)とは、16を底(てい)とし、底およびその冪(べき)を基準にして数を表す方法である。
十六進記数法とは、十六を底とする位取り記数法である。
位取り記数法(N進位取り記数法)では、まず基数(base。集合の基数(cardinal)とは異なる)となる自然数 N に対して、
の数値に対応する数字の記法を対応させるので、下表のようにする(A〜F を英小文字にする場合もある)。
次に、これらを用いて
という数字列で表現する。(ただし、a_*、b_* はそれぞれの 0 から F の数字であり、a_m\neq  0 とする)
この数字列が、
という数値であることを表すものである。
上記の数字列の先頭にマイナス符号「-」を付けることで負数を表現できる。
表記する方法は、20世紀半ばまで人やグループごとに異なっていて定まっていなかった(#初期の表記法)が、20世紀後半にコンピュータが普及して以降、つまりここ数十年は一般には、0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F の計十六個の文字を数字として用いることが定着している。
下記では慣用に従い、通常のアラビア数字は十進表記とし、十六進記数法での表記は  ( )16(括弧および下付きの16)で表す。
(2C.4A)16=2×16 + 12 + 4×(1/16) + 10×(1/16^2) = 32+12+0.25+0.0390625=44.2890625
コンピュータでは、データをビットやオクテットを単位として表すことが多い。それぞれ二進表記の1桁、8桁で表現できる。
使える数は、前者は0と1だけが許されるが、後者は0〜255までに広がる。
後者には、十六進表記がよく用いられ、二進表記の4桁が1桁で表現できるので、二進表記より短く表すことができる。1オクテットは、2桁の十六進表記で表現することができる。
十六進表記の1桁はニブルとも呼ばれる。
下記は具体例。左側はメモリアドレス。右側は十六進法(16進数)で表示された機械語やデータなど。この例ではアルファベットは小文字が使われている。画面(モニタ)に表示する時は、可読性を高めるために2文字や4文字ごとに空白をはさむことが一般的である。
十六進表記はよく使われるので、プログラム言語ではリテラルとして特別な表記が準備されていることが多い。一般に、大文字の A〜F と小文字の a〜f を区別しない。
(1000)16 の表記の例を挙げる。
読み方は十進表記の1000((いっ)せん)と区別するため、文字並びのまま読む(例えば、0x1000 は「ぜろ・エックス・いち・ぜろ・ぜろ・ぜろ」と読む)。慣用では「ヘキサの千」もしくは「千ヘキサ」と言った読み方も行われている。
上記の数字に付く h や x は英語で十六進法を意味する hexadecimal から取ったものである。十六進表記であることを明示している。
A - F の文字を用いて 9 以上の数字を表現する方法はコンピューター黎明期にはまだ一般的ではなかった。
1968年にBoby Lapointeが新たな表記Bibi-binaryを定義した。この表記は普及しなかった。
ブルックヘブン国立研究所のBruce Alan Martinは A〜F による表記に不快感を示し、ビット配列に基づいた全く新しい数字を考案して1968年にCommunications of the ACMへ提案したが、賛同者は少なかった。
7セグメントディスプレイでは、B,Dを8,0と区別するためb,dと小文字で表示する方法が採られた。
二進表記から十六進表記に変換する方法を、以下に示す。
二進表記を右から順に4桁ずつ区切る。最後(最左部分)が4桁未満のときは、空いた部分(左側)には全て0があるとみなす。
(111010)2 → (11, 1010)2 → (0011, 1010)2
各部分を十六進表記に変換する。
(0011)2 = (3)16, (1010)2 = (A)16
得られた十六進表記を並べて (3A)16 が得られる。
この方法は桁数に関わらず通用する。例えば、(100110010111010)2 は (0100, 1100, 1011, 1010)2 であるから、(4CBA)16 となる。
小数部分の変換方法は、次のとおり。
二進表記を小数点を基準にして左から順に4桁ずつ区切る。最後(最右部分)が4桁未満のときは、空いた部分(右側)には全て0があるとみなす。
(0.110101)2 → (0., 1101, 0100)2
各部分を十六進表記に変換する。
(1101)2 = (D)16, (0100)2 = (4)16
得られた十六進表記を並べて (0.D4)16 が得られる。
したがって、(111010.110101)2 = (3A.D4)16 である。この方法は桁数に関わらず通用する。
末尾が0、2、4、6、8、A、C、Eは偶数。
末尾が0、4、8、Cは複偶数(4の倍数)。
末尾が0、8は8の倍数。
末尾が0は1610の倍数。
下2桁が00は25610の倍数。
3の倍数は十進法と同じく数字和が3の倍数。
5の倍数は六進法と同じく数字和が5の倍数。
1510の倍数は数字和が15の倍数。
4810の倍数は末尾0で数字和が3の倍数。
8010の倍数は末尾0で数字和が5の倍数。
24010の倍数は末尾0で数字和が15の倍数。
76810の倍数は下2桁00で数字和が3の倍数。
128010の倍数は下2桁00で数字和が5の倍数。
384010の倍数は下2桁00で数字和が15の倍数。
割り切れない小数の循環部は下線で示す。「10」となる十六には因数に奇数が含まれていないため、1/3や1/5といった「1÷奇数」が全て割り切れない。小数を分数化しても、「m/奇数」となる小数が全く現れない。従って、偶数も、1/6 {1÷(2×3)} や1/A {1÷(2×5)} といった「1÷奇数で割り切れる偶数」は割り切れない。六の倍数も十の倍数も逆数にすると全て割り切れないので、単位分数は無限小数が充ち溢れ、逆数が有限小数になる例は2の冪数だけになる。
被除数がB(十進法の11)
十六進法:B ÷ 3 = 3.AAAA…
十六進法:B ÷ 5 = 2.3333…
六進法:(15)6 ÷ 3 = 3.4
十二進法:B ÷ 3 = 3.8
十進法:(11)10 ÷ 5 = 2.2
二十進法:B ÷ 5 = 2.4
被除数が8E(十進法の142)
十六進法:(8E)16 ÷ 3 = 2F.5555…
十六進法:(8E)16 ÷ 5 = 1C.6666…
六進法:(354)6 ÷ 3 = 115.2
十二進法:(BA)12 ÷ 3 = 3B.4
十進法:(142)10 ÷ 5 = 28.4
二十進法:(72)20 ÷ 5 = 18.8
一桁同士の計算:
Hexadecimalはギリシャ語で6 (ἕξ, hex) を意味するhexa-と、ラテン語で10番目 (tenth) を意味する-decimalの複合語。ウェブスター新国際オンライン版第3版によるとhexadecimalは完全ラテン語由来のsexadecimalの代替語である(Bendixのドキュメントにも同様の記述がある)。Merriam-Webster's Collegiate Dictionaryにおけるhexadecimalの初出は1954年で、当初より現在に至るまで国際科学用語ISVに分類されている。ギリシャ語とラテン語を混ぜ合わせた造語法はISVでは一般的にみられる。六十進法を意味するsexagesimalはラテン語の接頭子を保っている。ドナルド・クヌースはラテン語で16進数を表すとするならばsenidenaryか、または恐らくsedenaryが正しいのではないかとしている(同じ作り方で考えればbinary (2進数)、ternary (3進数)、quaternary (4進数)となり、この流れでいえばdecimal (10進数)とoctal (8進数)も、それぞれdenaryとoctonaryが正しいことになる)。アルフレッド・B・テイラーは16進数を不便な数字だとして嫌っていたが、1800年代にsenidenaryとして16進数を研究していた。シュワルツマンによると、ラテン語から考えればsexadecimalが自然だが、コンピュータのハッカーたちは略語にsexを使うだろうと話した。語源的に完全ギリシャ語で考えればhexadecadic(ἑξαδεκαδικός el)が正しいと考えられる(ただし現代のギリシャではdecahexadic(δεκαεξαδικός el)が使われている)。
単位系の十六進法では、数は十進法を用いて表記し、16に至ると単位を繰り上げる方法を採る。
ヤード・ポンド法では、質量の単位に十六進法が用いられる。
1 ポンド = 16 オンス。
1 オンス = 16 ドラム。
尺貫法の質量の単位の一部にも十六進法が用いられる。
1 斤 = 16 両。