理解二進制和十六進制的最佳方法是先透徹的領悟十進制計數系統。十進制(Decimal)系統是基於10的計數系統(詞根Deci-表示10)。“基於10”指的是由10個數位(Digit)0到9來表示數。
使用“位置(Place Value)”,可以用不多的幾個數位(如10個十進制數位)來表示很大的數。所有計數系統的位置從最右邊開始,是基數的0次冪。從右往左,基數的冪依次增加1:
X4X3X2X1X0
基數是10時,前5個位值是: 104103102101100
對任何基數,前兩個位值是最容易計算的。任何數的0次冪是1,所以100=1。任何數的1次冪就是它本身,所以101 = 10。第三個位值也是容易計算的,只要簡單地用第二個位值乘以基數就可以。事實上,每一個位值都可以用它前面一個位值乘以基數計算出來。所以上面5個位值是:
100= 1 = 1
101= 1×10 = 10
102= 10×10 = 100
103= 100×10 = 1000
104= 1000×10 = 10000
根據位值來讀一個數,比如57 258,指的是有5個10 000,7個1 000,2個100,5個10,以及8個1。
就是說: 5×10 000 = 50 000 7×1 000 = 7 000 2×100 = 200 5×10 = 50 8×1 = 8 將這些結果相加,結果:50 000 + 7000 + 200 + 50 + 8=57 258。
我們對十進制非常熟悉。所以,我們很少會去考慮將一個數分解成位值。但是,這種方法對於闡明其他進制的數是非常至關重要的。
二進制數 計算機從最底層來看,只不過是電子開關的集合而已。而數字和字符是由這些開關的狀態來表示的。由於一個開關僅有兩種狀態——“開”或者“關”,所以它使用二進制(Binary),或者說基數爲2的計數系統(詞根bi表示2)。一個基數爲2的系統僅僅有兩個數位:0和1。計算機通常將這兩個數位集合成8個位值,即一個字節(Byte)或八位組字節(Octet)。
這8個位值是: 2726252423222120 位值這樣計算:
20 = 1
21 = 1×2 = 2
22 = 2×2 = 4
23 = 4×2 = 8
24 = 8×2 = 16
25 = 16×2 = 32
26 = 32×2 = 64
27 = 64×2 = 128 所以一個二進制八位組的位值: 128 、64 、32 、16 、8 、4 、2 、1
因此,二進制八位組10010111可以這樣理解:
1×128 = 128
0×64 = 0
0×32 = 0 1×16 = 16
0×8 = 0
1×4 = 4
1×2 = 2
1×1 = 1
或者:128 + 16 + 4 + 2 + 1 = 151 對於二進制數,因爲每一個位值要麼就是該值本身,要麼就沒有,所以比較簡單。
另外一個例子:11101001 = 128 + 64 + 32 + 8 + 1 = 233。就是說,將二進制轉換爲十進制僅僅是一個將位值相加的過程,將十進制轉換爲二進制僅僅是將位值相減的過程。
例如,要將十進制數178轉爲二進制,首先把178減去最高的位值:
1、178大於128,所以我們就知道在該位值上有一個1: 178 – 128 = 50。
2、50比64小,該位值上有一個0。
3、50比32大,所以該位值上有一個1: 50 – 32 = 18。
4、18比16大,該位值上有一個1: 18 – 16 = 2。
5、2比8小,該位值上有一個0。
6、2比4小,該位值上有一個0。
7、2等於2,該位值上有一個1: 2 – 2 = 0。
8、0小於1,該位值上有一個0。
把這些步驟的結果綜合起來,用二進制表示178是:10110010。
另外一個例子可能會有幫助。給出110:
1、110比128小,所以在該位值上有一個0。
2、110比64大,所以在該位值上有一個1: 110 – 64 = 46。
3、46比32大,所以在該位值上有一個1: 46 – 32 = 14。
4、14比16小,所以在該位值上有一個0。
5、14比8大,所以在該位值上有一個1: 14 – 8 = 6。
6、6比4大,所以在該位值上有一個1: 6 – 4 = 2。
7、第2個位值上有一個1: 2 – 2 = 0。
8、0比1小,所以在該位值上有一個0。 所以,110用二進制表示就是:01101110。
十六進制數 寫一個二進制八位組並不有趣。對於經常要使用這些數字的人來說,受歡迎的是更簡潔的表示法。一個可能的表示法是爲每一個可能的八位組分配一個單獨的字符。但是,8位有28 = 256種不同的組合,所以,用單獨的字符表示所有八位組需要256個數位,或者說一個基數爲256的計數系統。 將一個八位組看作是兩個各4位的組合或許會更簡單一些。例如,11010011可以看作是1101和0011。對4個位來說,有24 = 16種不同的組合,所以有基數16,或者說十六進制(Hexadecimal)計數系統,一個八位組可以用兩位來表示(詞根hex的意思是“six”,deci的意思是“ten”)。
十六進制 十進制 二進制
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
A 10 1010
B 11 1011
C 12 1100
D 13 1101
E 14 1110
F 15 1111
因爲十六進制和十進制的前10個數字是一樣的,所以我們有意在一個十六進制數前面加0x,或者在後面加一個h,以便和十進制數區分開。例如,十六進制數9應該寫成0x9或者9h。 剛纔學過二進制的表示法,很容易寫出一個4位二進制數的十進制表達形式。同樣也很容易將一個十進制數轉爲十六進制。
於是,我們可以很容易地通過3個步驟將一個二進制八位組轉爲十六進制:
1、將八位組分成2個4位的二進制數。
2、將每個4位二進制數轉爲十進制。
3、把每個十進制數用十六進制來表示。
例如:把11010011轉爲十六進制:
1、11010011變成1101和0011。
2、1101 = 8 + 4 + 1 = 13,0011 = 2 + 1 = 3。
3、13 = 0xD,3 = 0x3。 所以,11010011用十六進制表示就是0xD3。
把十六進制轉爲二進制是上述3步的簡單逆序。例如,把0x7B轉爲二進制:
1、0x7 = 7,0xB = 11。
2、7 = 0111,11 = 1011。
3、把2個4位二進制數寫在一起就是0x7B = 01111011,十進制爲123。