web-dev-qa-db-ja.com

16進法とは何ですか?

16進法とは何ですか?なぜそれがコンピューティングでそれほど使用されているのですか?コンピューターは0と1を使用してデータを格納することを知っているので、なぜ16進数を使用するのですか?

13
Justin Krejcha

16進数は、コンピューティングで非常に一般的な記数法です。 binary について聞いたことがあるかもしれませんが、これには1と0しかありません。

人間は主に decimal (base 10)システムを使用します。このシステムには10個の数字があります。

0、1、2、3、4、5、6、7、8、9

ただし、コンピューターは10進法を使用して動作しません。それらはバイナリ状態(何かがtrueまたはfalseのいずれか)を持っているため、基数2(バイナリ番号には通常0bが接頭辞として付けられます)で動作し、数字は0と1のみです。

以前は、 8進数 (または基数8)が使用されていました。基数8の「10」は2進数で「0b1000」だったので良かったです(10進数の10は2進数の1010です)。数字を書くとき、8進数は通常「0o」の接頭辞が付きます(ただし、ほとんどのプログラミング言語では「0」の接頭辞が付きます)。 8桁の数字があるため、8進数と呼ばれます。

Octalは今日でも使用されていますが、ほとんどの場合、UnixおよびLinuxで 権限の設定

時間の経過とともに、計算能力とスペースが急速に増加しているため、より大きな数を表す簡単な方法が必要でした。 hexadecimal 、つまり基数16を使用することが標準になりました。これは、8のように16が2の累乗であり、桁ごとの変換を簡単に行えるためです( このコメントを参照) 。16個の数字があるため、他の数字には文字が使用されました。また、16進数には通常0xが前に付けられます。

16進数は4ビット(1つの8進数は2を表すことができます)であり、1バイトに2つの数値があるため、16進数も役立ちます。ほとんどの 16進エディタ では、これがバイトの表現方法です。

カウント

基数10には、10個の数字があります。 9日後、私たちは何をしますか?数字が足りません。元の数字の左側に「十」の場所を作成し、それを1にし、右端を0にします。16進数でも同じことが起こります。

0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、10、11など

0x1Fに到達するまで、プロセスは0xFF(10進数で255)まで繰り返され、その後0x100になります。カウントの詳細については、 ここにあります を参照してください。

これは、10進数、16進数、8進数、および2進数の間の変換を示すグラフです。 Hexadecimal Conversion Chart

31
Justin Krejcha

16進法とは

16進法は、16桁(0123456789ABCDEF)、2(01)、または10(0-9)を使用する10進数。 (システムでは)数字は10桁しかないため、代わりにAからFまでの文字を使用して、「数字#10」、「数字#11」などを表します。

なぜそれがコンピューティングでそんなに使われるのですか

16は2の累乗であるため、16進数を2進数に簡単に変換できます。ご指摘のとおり、「コンピューターは0と1を使用してデータを格納します」。各桁は正確に4ビットのデータを格納するため、16進数は4桁の2桁(1ビット)に簡単に変換でき、その逆も可能です。

| hex bin  | hex bin  |
| 0   0000 | 8   1000 |
| 1   0001 | 9   1001 |
| 2   0010 | A   1010 |
| 3   0011 | B   1011 |
| 4   0100 | C   1100 |
| 5   0101 | D   1101 |
| 6   0110 | E   1110 |
| 7   0111 | F   1111 |

なぜ16進数を使用するのですか

2進数よりも大きな数を表すのが簡単になります。次のように、2桁の16進数で256の異なる値を表すことができます。

dec  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...
hex 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 ...

4桁の16進数は、65536の値を表すことができます。 16進数を使用すると、 hexdump と呼ばれるものでデータを検査するのがはるかに簡単になります。 0から256までの数値( [〜#〜] ascii [〜#〜] と呼ばれるか、他のエンコーディングを使用することもあります)。さらに、他の多くのファイル形式(PNGなど)は、ファイルを構成する各情報に256ビットが含まれるように調整されています。

要約すると、16は2の累乗であり、256は16の累乗です。これにより、2進数とテキストまたはその他のデータの両方を表すための優れた方法になります。

4
Doorknob

16進法とは何ですか?

数値abcdがある場合、これは((a * + b)+ c)+ dと同等です。したがって、これは次のようになります。

  • abcd(binary)=((a * 2 + b)* 2 + c)* 2 + d
  • abcd(octal)=((a * 8 + b)* 8 + c)* 8 + d
  • abcd(10進数)=((a * 10 + b)* 10 + c)* 10 + d
  • abcd(hexadecimal)=((a * 16 + b)* 16 + c)* 16 + d

16進法では、16桁が必要ですが、使用できるのは10桁(0..9)だけです。したがって、欠落している6桁の場合、文字A..FはA = 10、...、F = 15で使用されます。

もちろん、たとえば5または7をベースとする、他の多くの数体系についても考えることができます。

数値を使用した計算の場合、使用している基数は関係ありません。バイナリシステムで加算および乗算でき、10進システムで実行でき、16進システムで実行できます。私たちは10進法で計算するのに使用され、コンピューターは2進法で計算します。

なぜ16進法がコンピューティングでそれほど多く使用されているのですか?

上記のように、どの番号システムで番号を指定してもかまいません。基になる番号は同じですが、表現のみが変更されます。コンピュータは内部的に常に数値を2進数で保存および使用(計算など)します。

では、なぜプログラマー(私のような)は異なる数体系を使用するのでしょうか。 2の累乗に基づいて数値システムを選択する理由は2つあります。1つ目は短さであり、2つ目はどのビットが設定されているかをよく知ることです。

息切れ

バッファの内容をコンソールに書き込む関数がある場合は、1〜3桁(10進数:0..255)の10進数で出力するコードを記述できます。数値を2進形式で書いている場合、1〜8桁の出力になります(2進:0..11111111)。 8進法を使用して、1から3桁(8進:0..377)または1から2桁の16進(16進:0..ff)にすることもできます。

これは1バイトのみでした。 32ビットの数値を書きたいとしましょう:

  • バイナリ:0..11111111111111111111111111111111
  • 8進数:0..37777777777
  • 10進数:4294967295
  • 16進数:0..ffffffff

ご覧のとおり、16進出力が最短です。

ビットを見る

パックされた情報を格納するための一般的なパターンは、バイト内の各ビットを個別に使用することです。ファイル属性を例にとってみましょう( [〜#〜] mdsn [〜#〜] を参照)。 「非表示」、「アーカイブ」、「読み取り専用」、「一時」などの属性が必要です。各属性を1バイトに格納することも、情報を1バイト(または複数バイト)にパックすることもできます。各ビットは正確に1つの属性を表します。 MSDNの記事のdwFlagsAndAttributesを見ると、Windowsがこのパターンを使用していることがわかります。

ここでは、MSDNページでFILE_ATTRIBUTE_ENCRYPTEDを例にとります。このフラグは10進数の16384と16進数の0x4000です。先頭の「0x」は、16進数をマークするためのCプログラマの規則にすぎないため、4000だけを見ていきます。どのビットが設定されているかを知りたい場合は、最初に16384を2進数に変換する必要があります。通常は暗算で行います。しかし、16進数の4000を考えてみましょう。これは非常に簡単です。 16は2 * 4であるため、すべての16進数は正確に4ビットです。そのため、4をバイナリ0100に、0をバイナリ0000に変換すれば完了です。

多くの場合、それは個々のビットではありませんが、プログラマーは2の累乗に物事を揃える傾向があります。ランダムなアドレスではなく、16の最下位ビットがゼロに設定されたアドレスにプログラムをロードします。そうすれば、アドレス0x12345678がある場合、このアドレスが0x03810000にロードされたプログラムではなく、0x1234にロードされたプログラムに属していることが簡単にわかります。

2進数、8進数、または16進数を優先しますか?

それは味の問題です。ビットを直接確認したい場合は、バイナリで十分かもしれません。長い数値の場合、ビット23またはビット24が設定されているかどうかを確認するために桁数をカウントする必要がある場合、2進数はイライラする可能性があります。これは、各桁が4ビットを表すため、16進数を使用すると簡単です。したがって、関与するカウントが少なくなります。個人的に私はめったに8進数を使いません。それは非常にまれです。

しかし、なぜベース32を使用しないのですか?

ベース32は2の累乗で、これは素晴らしいことです。ただし、0..9、A..Vのように32桁が必要になります。これは覚えておくべき桁数がはるかに多いです(どの番号「S」が応答するかを簡単に見つけることができますか?)。もう1つの注意点は、ベース32では、2桁の16進数が正確に1バイトであるというNice機能が失われることです。これは、メモリの内容を確認する場合に非常に便利です。また、ベース32では、1バイトが持つことができる値を表すために2桁が必要です。 32ビット値の場合、必要なのは8桁の16進数ではなく7桁だけですが、基本32システムの欠点を克服するにはそれほど多くはありません。

2
Werner Henze

現在使用されているさまざまな数値表現システムは(= include)です。
2進数、8進数、10進数、16進数。
どちらを選択するかは、多くの場合、目前のタスクの使いやすさに依存します。

バイナリは、電子機器内で簡単に表現できるため、コンピュータシステムおよびデジタルテクノロジー内で一般的に使用されます。基数2の数値の関数は、オン/オフ、true/false、またはその他の同様の2状態の繰り返し情報の表現と同様に、構築が簡単です。

octalは、3つの2進数のグループがある場合に便利です。 Unix/Linuxのパーミッション設定の場合と同様です。

10進数を少しの間スキップするhexadecimalは、8進数と同じように4桁の2進数でいいです。8ビット、1バイトが2桁の16進数にうまく収まるという事実です。 (=答え
これにより、コンピュータの8ビットの偶数グループは簡単に書き留められ、表現され、理解されます。つまり、ソフトウェアの作成、データの処理(HTML/CSSのrgbカラー値など)、データ構造の作成、およびその他の同様のことを日常的に行う場合に非常に便利です。

10進数。 10進法は、10本の指と足の指があるという事実から発展したと推測できます。 1桁は、カウントされるアイテムの数を表します。最大10までは各指に1つずつです。

これらは、以下をベースとする数体系を表します。
2、8、10、16。

通常、ベースは、カウントできる1桁の「アイテム」の数を示します。 2進数は2つ、10進数は10です。
16進数には16個の1桁の項目があるため、システムには16個の「数値」が必要です。したがって、0〜9とaf(10進数と比較して6個余分)を使用します。ここで、「a」は10に等しく、「f」は15に等しくなります。 10進法。

一般モードを続行するには:Niceがあれば、任意のbase2以上が他のものと同様に機能します。 1桁の表現。

10進数の数値は次のように形成されます。

 
 ... d *10³+ c *10²+ b *10¹+ a *10⁰

10進数「dcba」の場合-0123456789から選択されたd、c、b、a

次に、これを次のように変更します。

 
 ... d *base³+ c *base²+ b *base¹+ a *base⁰

そして、基数2以上がどのように「機能する」かを示すより一般的な形式があります。
例えば。 5桁の基数5は、上記の他のいずれかと同じくらい便利な場合があります。または、12桁(1ダース)のシステムで時間(12時間= "10"基数12、最初の「10進数」で1/12時間[5分]です)

注:⁰¹²³-画面に他の何かが表示されている場合は上付き文字0123

1
Hannu