“沒有什麼比有效編碼更好的了,阿米戈!相信一個老機器人。”

“你是說間諜使用的密碼嗎?”

“當然不是。我說的是以易於理解的形式呈現信息。關於數字系統。你知道在日常生活中大多數人都使用十進制系統。它使用 10 個符號來表示每個數字:0、1、2、 3、4、5、6、7、8、9,有10個數位,故稱十進制。

“這對十根手指的人類來說很方便。但程序員是偉大的發明家。他們立即想出了使用不同位數的編碼。例如,2、8、16 或 64 位數字。他們這樣做是為了方便依賴‘有信號/無信號’的計算機。”

“啊,我明白他們的共同點了……所有這些系統都是基於二的冪。

八進制編碼

“很好的觀察。讓我們從涉及 8 位數字的編碼開始。人類可能會發現這是最簡單的:只需刪除數字 8 和 9 並且 - 砰 - 你有八進制編碼(數字系統)。你最近被告知文字,吧?”

“是的,我是。”

“好吧,驚喜!你可以設置使用八進制系統編碼的數字文字。當然,如果你真的需要的話。這比聽起來容易。只需在整數前面加上 0 即可

“所以如果數字文字以零開頭,是否意味著它是八進制的?”

“是的,Java 會將其視為八進制。

例子:

代碼 筆記
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 不是八進制編碼中使用的符號之一。

“你不太可能需要在你的代碼中寫八進制數,但你應該知道它們是什麼。”畢竟,你將不得不閱讀別人寫的代碼。如上所述,程序員是大發明家。

好吧,請記住,你不能在每個數字前都寫上 0。”

“但如果我打算讓它是八進制的,那麼我可以嗎?”

“是的。

二進制編碼

“即使你還不明白,二進制編碼是你的母語。讓我提醒你一下。如果八進制只有數字 0-7,那麼二進制只有 0 和 1。”

“為什麼需要這種編碼?”

“正如我上面提到的,這與計算機的內部結構息息相關。計算機中的一切都靠電力運行,而碰巧的是,使用電力存儲和傳輸某些東西的最有效方式是使用兩種狀態:要么電線中沒有電(零)並且有電(一)。”

“所以才會這麼受歡迎……嗯,看來我確實開始記住這門語言了!”

“所有的機器人都非常理解它。雖然它在 Java 中並不經常使用。Java被認為是一種高級語言,完全從它運行的硬件中抽像出來。事實上,你真的關心用什麼格式來存儲和處理數據在電腦裡面?

“但在過去的幾十年裡,程序員開始喜歡二進制編碼(以及基於它的其他編碼)。因此,Java 具有將二進制數作為輸入的運算符。浮點數的準確性取決於它們的二進制數表示。

“總之,這種編碼你知道總比不知道好。”

“是的。就像八進制編碼一樣,Java 有一種使用二進制系統對文字進行編碼的方法。”

“所以他們只會由0和1組成?”

“完全正確。為了讓Java 編譯器理解代碼包含以二進制編碼的數字文字,而不是簡單的由 0 和 1 組成的十進制數字,習慣上所有二進製文字都以前綴 0b(' b ' 來自二進制一詞)。

例子:

代碼 筆記
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 不是二進制編碼中使用的符號之一。

十六進制編碼

“二的四次方是多少?”

“十六歲,你問對了一個機器人的問題是對的!”

“看來你已經很遠了,反正十六進制。除了八進制和二進制編碼,字面量也可以寫成十六進制,這是一種很流行的編碼方式。”

“那是因為儘管二進製表示法盡可能接近數字的實際存儲方式,但人類很難有效地處理這些數字:在二進制中,100 萬是 20 位數字,而不是 7。

“這就是程序員想出十六進制系統的原因。畢竟,正如您正確指出的那樣,16 是 2 的 4 次方,因此正好 4 位對應於一個十六進制數字。

“所以現在每 4 位都可以寫成一個十六進制數字。”

“對。十六進制編碼也有自己唯一的前綴:0x。例子:

十進制數 二進制符號 十六進製表示法
17 0b 0001 0001 0x 1 1
4 1 0b 0010 1 00 1 0x 2 9
85 0b 0101 0101 0x 5 5
256 0b 1 0000 0000 0x 1 0 0

“好的,所以很清楚我們是如何得到八進制系統的:我們只是丟掉了數字 8 和 9。但是我們從哪裡得到十六進制系統的 6 個缺失數字?我想看看它們!”

” 都是直截了當的,取英文字母的前6個字母作為6個缺失數字:A(10)、B(11)、C(12)、D(13)、E(14)、F(15) .

例子:

十六進製表示法 二進制符號 十進制數
0x 1 0b 0000 0001 1個
0x 9 0b 0000 1001 9
0xA _ 0b 0000 1010 10
0xb _ 0b 0000 1011 11
0x C 0b 0000 1100 12
0xD _ 0b 0000 1101 13
0x E 0b 0000 1110 14
0xF _ 0b 0000 1111 15
0x 1F _ 0b 0001 1111 31
0x A F 0b 1010 1111 175
0x F F 0b 1111 1111 255
0x F F F 0b 1111 1111 1111 4095

“如何將十六進制數轉換為十進制數?”

“這很簡單。假設你有數字0 x A F C F。十進制是多少?首先,我們有一個位置數字系統,這意味著每個數字對總數的貢獻增加了一個因子16 當我們從右向左移動時:

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

符號 A 對應數字 10,字母 C 表示我們有數字 12,字母 F 表示十五。我們得到:

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

將 16 乘以對應於數字的各種冪,我們得到:

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

我們總結一切並得到:

45007

“現在你知道 45007 是如何存儲在內存中的了吧。”

“是的,我知道。它是0x A F C F

“現在讓我們把它轉換成二進制。在二進制中它將是:

0b 1010 1111 1100 1111

“每組四位正好對應一個十六進製字符。這非常方便。沒有任何乘法或冪運算。”