“沒有什麼比有效編碼更好的了,阿米戈!相信一個老機器人。”
“你是說間諜使用的密碼嗎?”
“當然不是。我說的是以易於理解的形式呈現信息。關於數字系統。你知道在日常生活中大多數人都使用十進制系統。它使用 10 個符號來表示每個數字:0、1、2、 3、4、5、6、7、8、9,有10個數位,故稱十進制。
“這對十根手指的人類來說很方便。但程序員是偉大的發明家。他們立即想出了使用不同位數的編碼。例如,2、8、16 或 64 位數字。他們這樣做是為了方便依賴‘有信號/無信號’的計算機。”
“啊,我明白他們的共同點了……所有這些系統都是基於二的冪。
八進制編碼
“很好的觀察。讓我們從涉及 8 位數字的編碼開始。人類可能會發現這是最簡單的:只需刪除數字 8 和 9 並且 - 砰 - 你有八進制編碼(數字系統)。你最近被告知文字,對吧?”
“是的,我是。”
“好吧,驚喜!你可以設置使用八進制系統編碼的數字文字。當然,如果你真的需要的話。這比聽起來容易。只需在整數前面加上 0 即可。
“所以如果數字文字以零開頭,是否意味著它是八進制的?”
“是的,Java 會將其視為八進制。
例子:
代碼 | 筆記 |
---|---|
|
x 為 13:1*8+5 |
|
x 為 21:2*8+5 |
|
x 為 83:1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0 |
|
這不會編譯:8 不是八進制編碼中使用的符號之一。 |
“你不太可能需要在你的代碼中寫八進制數,但你應該知道它們是什麼。”畢竟,你將不得不閱讀別人寫的代碼。如上所述,程序員是大發明家。
好吧,請記住,你不能在每個數字前都寫上 0。”
“但如果我打算讓它是八進制的,那麼我可以嗎?”
“是的。
二進制編碼
“即使你還不明白,二進制編碼是你的母語。讓我提醒你一下。如果八進制只有數字 0-7,那麼二進制只有 0 和 1。”
“為什麼需要這種編碼?”
“正如我上面提到的,這與計算機的內部結構息息相關。計算機中的一切都靠電力運行,而碰巧的是,使用電力存儲和傳輸某些東西的最有效方式是使用兩種狀態:要么電線中沒有電(零)並且有電(一)。”
“所以才會這麼受歡迎……嗯,看來我確實開始記住這門語言了!”
“所有的機器人都非常理解它。雖然它在 Java 中並不經常使用。Java被認為是一種高級語言,完全從它運行的硬件中抽像出來。事實上,你真的關心用什麼格式來存儲和處理數據在電腦裡面?
“但在過去的幾十年裡,程序員開始喜歡二進制編碼(以及基於它的其他編碼)。因此,Java 具有將二進制數作為輸入的運算符。浮點數的準確性取決於它們的二進制數表示。
“總之,這種編碼你知道總比不知道好。”
“是的。就像八進制編碼一樣,Java 有一種使用二進制系統對文字進行編碼的方法。”
“所以他們只會由0和1組成?”
“完全正確。為了讓Java 編譯器理解代碼包含以二進制編碼的數字文字,而不是簡單的由 0 和 1 組成的十進制數字,習慣上所有二進製文字都以前綴 0b(' b ' 來自二進制一詞)。
例子:
代碼 | 筆記 |
---|---|
|
х為4:1*4+0*2+0 |
|
х為15:1*8+1*4+1*2+1 |
|
х為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; |
|
這不會編譯: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
“每組四位正好對應一個十六進製字符。這非常方便。沒有任何乘法或冪運算。”
GO TO FULL VERSION