1. 8進数エンコーディング

エンコードといえば...ご存知のとおり、私たちは日常生活で10進法を使用します。すべての数値は10個の記号0、1、2、3、4、5、6、7、8、9を使用して表されます。10個あります。数値なので、このシステムは 10 進数と呼ばれます。

しかし、プログラマーは偉大な発明家です。彼らはすぐに、異なる数のシンボルを使用するエンコーディングを思いつきました。たとえば、16、8、2などです。

8 つのシンボルを使用する別のエンコーディングが最も簡単です。8 と 9 を削除するだけで、8 進エンコーディング ( 8 進数体系) が得られます。

そして、はい、8 進法を使用して数値リテラルを指定できます。もちろん、本当に必要な場合。思ったよりも簡単です。数字の前に数字の 0 を書き込むだけです。

つまり、Java は 0 で始まる整数リテラルを 8 進数値として扱います。

例:

コード ノート
int x = 015;
x は 13: 1*8+5
int x = 025;
x は 21: 2*8+5
int x = 0123;
x は 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
これはコンパイルできません。8 は 8 進エンコーディングで使用される記号の 1 つではありません。

コードに 8 進数を記述する必要があることはほとんどありませんが、それが何であるかを知っておく必要があります。結局のところ、他の人が書いたコードを読む必要があります。そして、上で述べたように、プログラマーは偉大な発明家です。

すべての数字の前に単純に 0 を書くことはできないことに注意してください。



2. バイナリエンコーディング

バイナリエンコーディングはさらに興味深いものです。8 進数には 0 ~ 7 の数字しか含まれない場合、2 進数には 0 と 1 のみがあります。なぜこのエンコーディングが必要なのでしょうか?

これはコンピューターの内部構造にすべて関係しています。コンピューター内のすべてのものは電気で動作します。そして、偶然にも、電気を使用して何かを保存および送信する最も効率的な方法は、ワイヤーに電気がない (ゼロ) か電気がある (1) かの 2 つの状態を使用することです。

これが 2 進数体系の普及の起源です。

原則として、Java ではあまり頻繁に使用されません。Javaは高級言語とみなされ、実行されるハードウェアから完全に抽象化されています。実際、コンピュータ内でデータを保存および処理するためにどのような形式が使用されているかを本当に気にしていますか?

しかし、過去数十年にわたり、プログラマーはバイナリ エンコーディング (およびそれに基づく他のエンコーディング) を好むようになりました。その結果、Java には 2 進数を入力として受け取る演算子が備わっています。また、浮動小数点数の精度は、そのバイナリ表現によって決まります。

基本的に、このエンコーディングについては知らないよりも知っていた方が良いでしょう。

8 進数エンコーディングの場合と同様、Java にはバイナリ システムを使用してリテラルをエンコードする方法があります。つまり、0 と 1 だけで構成されるリテラルです。Java コンパイラが、コードに単なる 0 と 1 から構成される 10 進数ではなく、バイナリでエンコードされた数値リテラルが含まれていることを理解できるように、すべてのバイナリ リテラルは接頭辞 0b を使用して識別されます (「b」は binary という単語に由来します)。 。

例:

コード ノート
int x = 0b100;
х は 4: 1*4+0*2+0
int x = 0b1111;
х は 15: 1*8+1*4+1*2+1
int x = 0b1111000111;
х は 967: 1*2 9 +1*2 8 +1*2 7 +1*2 6 +0*2 5 +0*2 4 +0*2 3 +1 *2 2 + 1*2+1;
int x = 0b12000;
これはコンパイルできません。2 はバイナリ エンコーディングで使用されるシンボルの 1 つではありません。


3. 16 進エンコーディング

8 進数および 2 進数のエンコーディングに加えて、リテラルを 16 進数で記述することもできます。これは非常に人気のあるエンコーディングです。

それは、2 進数表記は実際の数値の格納方法に可能な限り近いものであるにもかかわらず、人間がそのような数値を効果的に扱うのは難しすぎるためです。2 進数では、100 万という数字には 7 桁ではなく 20 桁が含まれます。

プログラマーが 16 進法を思いついたのはこのためです。結局のところ、16 は 2 の4乗なので、正確に 4 ビットが 1 つの 16 進数の数字に対応します。大まかに言えば、4 ビットごとを 1 つの 16 進数として書き込むことができます。

16 進エンコーディングには、独自の一意のプレフィックス0xもあります。例:

10進数 2進数表記 16進数表記
17 0b 0001 0001 0x11 _ _
4 1 0b 0010 1 00 1 0x 2 9
85 0b 0101 0101 0x 5 5
256 0b 1 0000 0000 0x100 _ _ _

OK、あなたは言うでしょう、私たちがどのようにして 8 進法を取得したかは十分明らかです。数字の 8 と 9 を捨てただけですが、16 進法用の 6 つの追加の記号はどこで入手できるのでしょうか? ぜひ見てみたいです!

それはすべて簡単です。英語のアルファベットの最初の 6 文字は、欠落している 6 つの記号として使用されました: A (10)、B (11)、C (12)、D (13)、E (14)、F (15)。

例:

16進数表記 2進数表記 10進数
0x1 _ 0b 0000 0001 1
0x9 _ 0b 0000 1001 9
0xA _ 0b 0000 1010 10
0xB _ 0b 0000 1011 11
0xC _ 0b 0000 1100 12
0xD _ 0b 0000 1101 13
0xE _ 0b 0000 1110 14
0xF _ 0b 0000 1111 15
0x1F _ _ 0b 0001 1111 31
0xAF _ _ 0b 1010 1111 175
0x F F 0b 1111 1111 255
0x F F F 0b 1111 1111 1111 4095


4. 数値を16進数から変換する方法

数値を 16 進数から 10 進数に変換するのは非常に簡単です。数値0 x A F C Fがあるとします。それは10進数でいくらですか?

まず、位置番号体系があります。これは、全体の番号に対する各桁の寄与が、右から左に移動するにつれて 16 倍に増加することを意味します。

A * 16 3 + F * 16 2 + C * 16 1 + F

記号 A は数字の 10 に対応し、文字 C は数字の 12 に対応し、文字 F は 15 を表します。我々が得る:

10 * 16 3 + 15 * 16 2 + 12 * 16 1 + 15

16 をその数字に対応するさまざまな累乗すると、次のようになります。

10 * 4096 + 15 * 256 + 12 * 16 + 15

すべてを合計すると次のようになります。

45007

この数値がメモリにどのように保存されるかはわかります。

0x A F C F

しかし、今度はそれをバイナリに変換しましょう。バイナリでは次のようになります。

0b 1010 1111 1100 1111

4 ビットの各セットは、正確に 1 つの 16 進文字に対応します。それはとても便利です。乗算や累乗は一切なしで。」