16進数(略してhex)は、数値を16進数で表すための位取り記数法です。最も一般的な慣例では、10進数と同様に「0」から「9」までの数字が用いられ、10から15までの数字は「A」から「F」までのアルファベット(大文字または小文字)で表されます。
一般的なコンピュータハードウェアはバイナリであり、16進数は2のべき乗であるため、16進数表現はバイナリ情報の密な表現としてコンピューティングでよく使用されます。16進数の1桁は、4つの連続したビット(ニブルと呼ばれる)を表します。[ 1 ] 8ビットのバイトは、16進数の2桁です。2C
数値が16進数であることを示すために、特別な表記法がよく用いられます。数学では、通常、添え字を使って基数を指定します。例えば、10進数値491 は16 進数では1EB 16と表されます。コンピュータ プログラミングでは、さまざまな表記法が使用されます。C や多くの関連言語では、接頭辞が0x使用されます。たとえば、。0x1EB
一般的に、16進数表現の規則では、小文字と大文字のどちらでも使用可能で、大文字と小文字の区別に関係なく文字は同じように扱われます。
非テキストデータを表示する場合、メモリに格納された値は、多くの場合、値の間にスペースを挟んだ16進数のシーケンスとして表示されます。たとえば、次の16進ダンプでは、各8ビットバイトは2桁の16進数で、その間にスペースが入っています。一方、先頭の32ビットオフセットは8桁の16進数です。
00000000 57 69 6B 69 70 65 64 69 61 2C 20 74 68 65 20 66 00000010 72 65 65 20 65 6E 63 79 63 6C 6F 70 65 64 69 61 00000020 20 74 68 61 74 20 61 6E 79 6F 6E 65 20 63 61 6E 00000030 20 65 64 69 74 2C 20 69 6E 63 6C 75 64 69 6E 67 00000040 20 79 6F 75 20 28 61 6E 64 20 6D 65 29 21数値を16進数で表す方法には、いくつかの慣例があります。
0x、その後に続く数値リテラルが16進数であることを示し、文字列または文字リテラルの文字はプレフィックスを使用して16進数で表現できます\x(たとえば、はEsc'\x1B'制御文字を表します)。また、 printfのような関数を使用して整数を16進数で出力するには、フォーマット変換コードまたはが使用されます。%X%x%。http://www.example.com/name%20with%20spacesここで、「」はスペース(空白)%20文字のコードであり、ASCIIコードポイントは16進数で20、10進数で32です。ode;TxTFFh05A3H0FFhFFh0x42$接頭辞として を使用します$5A3。$C1F27EDH'ABCD'(ABCD 16用)が使用されています。同様に、Fortran 95では Z'ABCD' が使用されています。16#5A3#、16#C1F27ED#。ビットベクトル定数には、VHDLでは表記法x"5A3"、を使用しますx"C1F27ED"。[ 4 ]8'hFF。ここで、8は値のビット数、FFは16進定数です。16#: 16#5A3,」で表されます。16#C1F27ED#xとを使用します#16r。変数 *read-base* [ 5 ]と *print-base* [ 6 ]を 16 に設定することで、Common Lisp システムのリーダーとプリンターを、数値の読み取りと出力に 16 進数表現に切り替えることもできます。したがって、入力または出力の基数が 16 に変更された場合、#x または #16r プレフィックス コードなしで 16 進数を表すことができます。&H。&H5A3&16 進数を使用します[ 8 ]0h接頭辞「0h5A3,」を使用します。0hC1F27ED16r、16 進数を表すのに接頭辞 を使用します16r5a3。216rC1F27ED進数、4 進数 (基数 4)、8 進数も同様に指定できます。X'5A3'または であり、アセンブラ、 PL/I、COBOL、JCLX'C1F27ED' 、スクリプト、コマンドなどで使用されます。この形式は、他の (現在は廃止された) IBM システムでも一般的でした。アポストロフィの代わりに引用符が使用される場合もありました。場合によっては、数値は常に16進数で表記されるため、識別表記は不要です。
#、:を接頭辞とする 6 桁の 16 進数 (赤、緑、青の各成分に 2 桁ずつ) で表現できます。たとえば、マゼンタ#FF00FFは と表されます。[ 10 ] CSS では、成分ごとに 1 桁の 16 進数を使用した 3 桁の 16 進数による省略も許可されています。たとえば、金色の#FA3オレンジは と省略されます。#FFAA33=、Espa=F1a「España」は「España」です(ISO/IEC 8859-1文字セットでは、 F1 16進数はñのコードです) 。 [ 11 ]AA213FD51B3801043FBC 。:) で区切られます。たとえば、次の アドレスは有効な IPv6 アドレスです。2001:0db8:85a3:0000:0000:8a2e:0370:7334または、先頭のゼロを削除して2001:db8:85a3::8a2e:370:7334( IPv4 アドレスは通常 10 進数で記述されます) と省略できます。3F2504E0-4F89-41D3-9A0C-0305E82C3301。

9より大きい数字を表すのに「A」から「F」以外の記号を使用する、注目すべきその他の16進数表現には、以下のようなものがあります。
16進数では、10進数と同様に、負の数を表す際に、数の前にマイナス記号(−)を付けることで負の数を表します。
プロセッサでは、16進数でビットパターンを表現できるため、16進数の桁の並びは符号付き浮動小数点値や浮動小数点値を表すことができます。このようにして、負の数 −42 10 は、 32 ビットCPU レジスタでは FFFF FFD6 ( 2 の補数)、 32 ビットFPUレジスタでは C228 0000、64ビット FPU レジスタではC045 0000 0000 0000 ( IEEE 浮動小数点標準) と表記できます。
10 進数が指数表記で表せるのと同様に、16 進数も指数表記で表せます。P 表記では文字P (またはp、「power」の略) を使用しますが、 10 進数のE 表記ではE (またはe ) が同様の役割を果たします。Pの後の数字は10 進数で、2 進数の指数を表します。指数を 1 増やすと、16 ではなく 2 倍になります。20p0 = 10p1 = 8p2 = 4p3 = 2p4 = 1p5 。通常、16 進数の桁が1から始まるように数値は正規化されます(0 は通常Pなしで0です)。
例: 1.3DEp42は1.3DE 16 × 2 42 10を表します。
P表記はIEEE 754-2008バイナリ浮動小数点標準で要求されており、Cプログラミング言語のC99版で浮動小数点リテラルに使用できます。[ 22 ] %aまたは%A変換指定子 を使用すると、この表記はC99仕様[ 23 ]および Single Unix Specification (IEEE Std 1003.1) POSIX標準[ 24 ]に準拠したprintf関数ファミリーの実装によって生成できます。

ほとんどのヨーロッパ言語には、11 から 15 までの数字の一部を表す非十進数ベースの単語がありません。一部の人々は、電話番号のように 1 桁ずつ 16 進数を読み上げたり、NATO フォネティック アルファベット、陸軍/海軍合同フォネティック アルファベット、または同様のアドホックシステムを使用したりしています。IBM System/360プログラマーの間で 16 進数が採用された後、Magnuson (1968) [ 25 ]は、16 進数の文字に短い名前を付ける発音ガイドを提案しました。たとえば、「A」は「ann」、Bは「bet」、Cは「chris」などと発音されます[ 25 ]。別の命名システムは、Rogers (2007) [ 26 ]によってオンラインで公開され、実際の数字に A~F の数字が含まれていない場合でも、口頭表現を区別できるようにしています。例は以下の表に示されています。さらに別の命名システムは、シリコン バレーのジョークに基づいて Babb (2015 ) によって考案されました。[ 27 ]
他にも、4ビットの16進数を表すために、モールス信号の音声規則を使用する方法が提案されている。「dit」と「dah」はそれぞれ0と1を表し、「0000」は「dit-dit-dit-dit」(....)、「dah-dit-dit-dah」(-..-)は9の値を持つ数字、「dah-dah-dah-dah」(----)は10進数の15の16進数を表す。
2進数と16進数の両方で、数字によるカウントシステムが考案されている。アーサー・C・クラークは、各指をオン/オフビットとして使用し、10本の指で0から1023 10まで数えることを提案した。[ 28 ] FF 16 (255 10 )までカウントする別のシステムが右図に示されている。

ほとんどのコンピュータはバイナリデータを操作しますが、比較的小さなバイナリ数であっても、多数の桁を扱うのは人間にとって困難です。ほとんどの人は10進法に慣れていますが、バイナリを10進数に変換するよりも16進数に変換する方がはるかに簡単です。なぜなら、16進数の各桁は整数ビット(4¹⁰ )に対応するからです。この例では、1111 2を10進数に変換します。バイナリ数の各桁には1または0のいずれかが含まれるため、右からの位置によってその値を簡単に判断できます。
したがって:
少し練習すれば、1111 2を F 16に1 段階でマッピングするのは簡単になります。10 進数ではなく 16 進数を使用する利点は、数値のサイズとともに急速に増加します。数値が大きくなると、10 進数への変換は非常に面倒になります。しかし、16 進数にマッピングする場合は、バイナリ文字列を 4 桁のグループとみなして、それぞれを 1 つの 16 進数にマッピングするのは簡単です。[ 29 ]
この例では、2進数を10進数に変換する方法を示しています。各桁を10進数値にマッピングし、結果を加算します。
これを16進数への変換と比較してみましょう。16進数への変換では、4桁のグループごとに独立して考えることができ、直接変換できます。
16進数から2進数への変換も同様に直接的である。[ 29 ]
4進数(基数4)はあまり使われませんが、16進数や2進数との間で簡単に変換できます。16進数の各桁は4進数の2桁に対応し、4進数の各桁は2進数の2桁に対応します。上記の例では、2 5 C 16 = 02 11 30 4 です。
8進数(基数8)も比較的容易に変換できますが、基数2や基数4ほど単純ではありません。8進数の各桁は、2進数では4桁ではなく3桁に対応します。そのため、8進数と16進数の変換は、まず2進数に変換し、次に2進数を3桁または4桁のグループに再編成することで行います。
すべての基数と同様に、数値表現を16進数に変換するには、元の基数で整数除算と剰余演算を行うという単純なアルゴリズムが存在します。理論的には、どの基数からでも変換可能ですが、ほとんどの人間にとっては10進数のみ、ほとんどのコンピュータにとっては2進数(こちらははるかに効率的な方法で変換できます)のみが、この方法で容易に処理できます。
d を 16 進数で表す数とし、数を表す 16 進数の桁をh i h i−1 ...h 2 h 1とします。
「16」は、必要に応じて他の任意のベース番号に置き換えることができます。
以下は、任意の数値を文字列表現の16進数に変換する上記のアルゴリズムのJavaScript実装です。これは上記のアルゴリズムを説明することを目的としています。ただし、データを本格的に扱う場合は、ビット演算子を使用する方がはるかに推奨されます。
関数toHex ( d ) { var r = d % 16 ; if ( d - r == 0 ) { return toChar ( r ); toHex (( d - r ) / 16 ) + toChar ( r )に戻ります。}function toChar ( n ) { const alpha = "0123456789ABCDEF" ;アルファを返します。charAt ( n ); }
最終的な表現を得るために乗算と加算を行う前に、ソース基数の各位にその位値の16進数表現を割り当てることによって変換を行うことも可能です。たとえば、数値B3ADを10進数に変換するには、16進数をB(11 10)、3(3 10)、A(10 10)、D(13 10 )の各桁に分割し、各10進数表現に16p(pは右から左へ0から数えた対応する16進数桁の位置)を乗算して最終結果を得ることができます。この場合、次のようになります。
B3AD = (11 × 16 3 ) + (3 × 16 2 ) + (10 × 16 1 ) + (13 × 16 0 )
これは10進数で45997です。
多くのコンピュータシステムには、16進数を含む様々な基数間の変換を実行できる電卓ユーティリティが備わっている。
Microsoft Windowsでは、電卓のプログラマーモードを使用すると、16進数とその他の一般的なプログラミング基数との間の変換を行うことができます。
除算などの基本的な演算は、一般的に使用されている10進数や、各16進数が4つの2進数に対応する2進数など、別の記数法に変換することによって間接的に実行できます。
あるいは、16進数システム自体の中で、加算・乗算表や、長除法や従来の減算アルゴリズムといった対応する標準アルゴリズムを利用して、基本的な演算を直接実行することもできます。
他の数字体系と同様に、16進数体系は有理数を表すために使用できますが、16(10 16)は素因数が2しかないため、繰り返し展開がよく見られます。
任意の基数に対して、0.1 (または「1/10」) は常に、その基数の値の独自の数体系での表現で 1 を割った値に等しくなります。したがって、2 進数で1 を 2 で割る場合でも、16 進数で 16 で割る場合でも、これらの分数はどちらも と表記されます0.1。基数 16 は完全平方数(4 2 ) であるため、16 進数で表された分数は、10 進数よりも奇数になる頻度がはるかに高く、循環小数(自明な 1 桁を除く) はありません。分母の既約分数が基数に存在しない素因数を持つ場合、循環小数が現れます。したがって、16 進数表記を使用する場合、分母が2 のべき乗でないすべての分数は、無限に続く循環小数 (3 進数や 5 進数など) になります。このため、16 進数 (および 2 進数) は、有限表現の範囲外にある割合が大きいため、有理数を表すのに10 進数よりも不便です。
16 進数で有限に表現できるすべての有理数は、10 進数、12 進数、および60 進数でも有限に表現できます。つまり、有限桁の 16 進数は、他の基数で表現した場合も有限桁になります。逆に、後者の基数で有限に表現できる数のうち、16 進数で有限に表現できるのは一部だけです。たとえば、10 進数の 0.1 は、16 進数では無限に循環する 0.1 9に対応します。ただし、16 進数は、分母に 2 のべき乗がある分数を表現するのに 12 進数や 60 進数よりも効率的です。たとえば、0.0625 10 (16 分の 1) は、 0.1 16、0.09 12、および 0;3,45 60と同等です。
以下の表は、よく見られるいくつかの無理数を10進数と16進数で表したものです。
以下に、10進数表現と比較して比較的単純であることを示すために、2の最初の16乗を16進数で示します。
中国の伝統的な測定単位は16進法でした。例えば、 旧システムでは1斤は16両に相当します。算盤(中国のそろばん)は、加算や減算などの16進法の計算に使用できます。[ 30 ]
12進法と同様に、16進法を好ましい数字体系として普及させようとする試みが時折行われてきた。これらの試みでは、個々の数字に特定の読み方や記号を提案することが多い。[ 31 ]標準的な単位を16の倍数に統一するという提案もある。[ 32 ] [ 33 ]こうした提案の初期の例として、ジョン・W・ニストロムが1862年に出版した『 算術、重量、測定、硬貨の新体系の計画:基数16のトーナルシステムと呼ばれる予定』がある。[ 34 ] ニストロムはとりわけ、1日を16で分割し、1日に16時間(または「10 tims」、tontimと発音)がある16進法を提案した。[ 35 ]
hexadecimal という単語は 1952 年に初めて記録されました。[ 36 ]これは、ギリシャ語のἕξ (hex)「6」とラテン語の-decimalを組み合わせたマカロニック語です。完全にラテン語の代替語であるsexadecimal (60 進法を表すsexagesimal という単語と比較) はより古く、19 世紀後半から少なくとも時折使用されています。[ 37 ]これは、1950 年代のBendix のドキュメント でもまだ使用されています。Schwartzman (1994) は、 sexadecimalの使用が、 sexを連想させる略語であるため避けられていた可能性があると主張しています 。[ 38 ] 1960年代以降、多くの西欧言語は16進数と同等の用語を採用してきた(例:フランス語hexadécimal、イタリア語esadecimale、ルーマニア語hexazecimal、セルビア語хексадецималниなど)が、他の言語では「16」の代わりに自国の単語を用いた用語を導入している(例:ギリシャ語 δεκαεξαδικός、アイスランド語sextándakerfi、ロシア語шестнадцатеричнойなど)。
用語と表記法が定着したのは 1960 年代末になってからだった。1969 年にドナルド・クヌースは、語源的に正しい用語はsenidenary、あるいはsedenaryであり、これはbinary、ternary、quaternaryなどをモデルにした「16 でグループ化された」という意味を表すラテン語由来の用語であると主張した。クヌースの主張によれば、 10 進数と8 進数の正しい用語は それぞれdenaryとoctonaryである。[ 39 ] アルフレッド・B・テイラーは1800 年代半ばの代替数基数に関する研究でsenidenary を使用したが、16 進数は「桁数が多すぎる」ため拒否した。[ 40 ] [ 41 ]
現在使用されているAからFまでの文字を用いた表記法は、IBM System/360用のFortran IVマニュアルの発行を機に、1966年から事実上の標準として確立された。このマニュアルは(以前のFortranとは異なり)16進定数を入力するための標準を認識している。[ 42 ] 上記のように、NEC (1960年)とPacific Data Systems 1020(1964年)では別の表記法が使用されていた。IBMが採用した標準は1968年までに広く採用されたようで、Bruce Alan MartinはCACMの編集者への手紙で次のように不満を述べている。
16進数記号にA、B、C、D、E、Fという馬鹿げた文字が使われていることで、8進数(または16進数)と10進数(または変数名)を区別するという既に厄介な問題がさらに悪化している現状を考えると、数字記号の見直しは喫緊の課題である。このような不適切な選択が事実上の標準となる前に、見直しを行うべきだったのだ。
マーティンの主張は、非十進数に0から9までの数字を使うことは「10進数の位取り記数法を暗示している」というものだった。「8進数や16進数に必要な7桁または15桁の非ゼロの数字に、全く新しい記号(と名前)を使えばいいのではないか。AからPまでの文字を使うだけでも改善になるが、全く新しい記号を使えば、システムの二進法的な性質を反映できるだろう」。[ 12 ] 彼はまた、「数字にアルファベット文字を再利用することは、16 世紀前に数字のために独自の非アルファベット文字が発明されたこと(ブラーフミー数字、そして後にヒンドゥー・アラビア数字体系として)から大きく後退することである」と主張し、最近のASCII規格(ASA X3.4-1963 および USAS X3.4-1968)は、「10 桁の 10 桁の後に 6 つのコード テーブル位置を保持すべきであった。これらの位置を、利用可能な 128 個の位置のどこかに配置できたはずの句読点文字 (":;<=>?") で不必要に埋めるべきではなかった」と主張した。
Base16は、 Base32、Base58、Base64と同じファミリーに属するバイナリからテキストへのエンコーディングです。データは4ビットのシーケンスに分割され、各値(0~15)が1文字としてエンコードされます。任意の16文字を使用できますが、実際には、 16進数の一般的な表記に合わせるため、 ASCII数字の「0」~「9」と文字の「A」~「F」(または「a」~「f」)が使用されます。
Base16エンコーディングのサポートは、現代のコンピューティングにおいて広く普及しています。これは、URLのパーセントエンコーディングに関するW3C標準の基礎となっており、文字はパーセント記号「%」とそのBase16エンコードされた形式に置き換えられます。ほとんどの最新のプログラミング言語は、Base16エンコードされた数値の書式設定と解析を直接サポートしています。
Base16エンコーディングの利点は以下のとおりです。
デメリットとしては、以下のような点が挙げられます。
&&O&Hでは通常「hex」と呼ばれます。誰も「sex」を略したくないためです) が得られます。16 進数言語の記号は、10 桁の 10 桁の数字と、G-15 タイプライターでは文字「u」、「v」、「w」、「x」、「y」、「z」です。これらは任意のマークです。他のコンピュータでは、最後の 6 桁に異なるアルファベット文字を使用する場合があります。