Java編程那些事兒7——進位的概念作者:陳躍峰出自:http://blog.csdn.net/mailbomb
1.2 進位的概念 因為不可能為每個數值都創造一個符號,所以需要用基本數字組合出複合的數值,這樣就有了進位的概念。 其實所有進位都是人為的創造,都是用來計數方便的。現在最常用的進位是十進位,當然其它的進位也在使用中。例如“半斤八兩”這個成語,就反映了古代一斤等於十六兩的概念,也就是十六進位計數方式。 電腦編程中常用的進位有二進位、八進位、十進位和十六進位,十進位還是最主要的表達形式。在編程中,大家書寫的數值預設為十進位。 對於進位,有兩個最基本的概念:基數和運算規則。l 基數基數指一種進位中組成的基本數字,也就是不能再拆分的數字。例如十進位是0-9,二進位是0和1,八進位是0-7,十六進位是0-9,A-F(大小寫均可)。或者可以簡單的這樣記憶,假設是n進位的話,基數就是[0,n-1]的數字,基數的個數和進位值相同,十進位有十個基數,依次類推。l 運算規則運算規則就是進位或借位規則,這個類似於一般電腦書籍中位權的概念,例如對於十進位來說,該規則是“滿十進一,借一當十”,也就是低位的數字滿十了向高位進一,從高位借到的一,相當於低位上的十。其它的進位也是這樣,對於二進位來說,就是“滿二進一,借一當二”,八進位和十六進位也是這樣。 在數學上表示一個數字是幾進位,通常使用如下格式:[數值]進位數,例如[10]2 表示位元值10。
1.2.1 二進位 二進位是電腦內部資料表示的形式,所以學習電腦編程必須熟悉二進位。熟悉二進位有以下幾個用途:l 更容易理解電腦的資料存放區方式電腦內部的很多轉換,例如資料類型之間的強轉,都可以用二進位解釋最終的結果的值。l 二進位的運算速度高二進位的運算速度比十進位高的多。例如求2的n次方,通過移位實現的效率比數學方法高效。l 使用位元值進行資料存放區以二進位的形式儲存數值,一個是比較節約資源,可以使用二進位的位來儲存資訊,例如常見的硬體控制資訊,都是二進位的形式進行提供的。 如前所述,二進位包含0和1兩個基數,運算規則是“滿二進一,借一當二”,下面簡單的介紹一下二進位的計數方式。 例如十進位的0-9用二進位進行表達,則依次是: 0,1,10,11,100,101,110,111,1000,1001 說明:數值之間使用逗號進行間隔。 下面是二進位的一些基本運算結果:l 加法運算 0 + 0 = 00 + 1 = 11 + 0 = 11 + 1 = 10l 減法0 – 0 = 00 – 1 = -1 1 – 0 = 11 – 1 = 0 l 乘法0 × 0 = 00 × 1 = 01 × 0 = 01 × 1 = 1l 除法0 / 0 無意義0 / 1 = 01 / 0 無意義1 / 1 = 1 以下是一些符合的運算式: 110 + 111 = 1101 這些基本的運算結構在實際開發中一般不會直接用到,但是通過這些內容可以加深對於二進位概念的理解。
1.2.2 二進位和十進位之間的轉換 由於電腦內部的資料是以二進位進行表達的,而十進位又是日常生活中最常用的進位,所以它們之間經常需要進行轉換。下面介紹一下轉換的方式。
1.2.2.1 十進位轉換為二進位 十進位整數轉換為二進位有三種方法,分別是除二取餘、計算機轉換和經驗法。十進位小數的轉換方法最後做簡單的介紹。1. 除二取餘法除二取餘法是轉換時的最基本方法,也是最通用的方法。規則為:使用十進位和2去除,取每次得到的商和餘數,用商繼續和2相除,直到商為零為止,第一次得到的餘數作為二進位的低位,最後一次得到的餘數作為二進位的高位,由余數組成的數字就是轉換後二進位的值。例如十進位的13轉換為二進位的計算步驟如下: 商 餘數 13 / 2 = 6 16 / 2 = 3 03 / 2 = 1 11 / 2 = 0 1 則計算的最終結果就是1101。2. 計算機轉換Windows作業系統中的計算機也可以很方便的實現進位之間的轉換。在程式菜單中附件子功能表中開啟計算機,從開啟的計算機的查看菜單中,選擇“科學型”,輸入你要轉換的十進位的數字,例如13,然後介面上數字顯示框西側的“二進位“,則轉換後的數值就直接顯示在計算機中。3. 經驗法對於二進位熟悉以後,那麼計算十進位對應的數字可以通過一些基本的數學變換來實現,在使用經驗法以前,必須熟記2的0-10次方對應的十進位的值,依次是: 1,2,4,8,16,32,64,128,256,512,1024則轉換一些特殊的數字時可以極大的提高轉換速度,例如數字65,則可以這樣轉換: 65 = 64 + 164對應的二進位形式為10000001對應的二進位形式為1則65的二進位形式為1000001這個只適合轉換一些特殊的數字,適應性沒有除二取餘法廣泛。 十進位小數的轉換採用的一般方法是乘二取整法,規則為:對於小數部分先乘二,然後獲得運算結果的整數部分,然後將結果中的小數部分再次乘二,直到小數部分為零為止,則把第一次得到的整數部分作為二進位小數的高位,後續的整數部分作為地位就是轉換後得到的二進位小數。需要說明的是,有些十進位小數無法準確的用二進位進行表達,所以轉換時符合一定的精度即可,這也是為什麼電腦的浮點數運算不準確的原因。 例如0.25轉換為二進位小數的步驟如下: 整數部分 0.25 × 2 = 0.5 0 0.5 × 2 = 1.0 1 則0.25轉換為二進位小數為0.01 如果一個十進位數字既有整數部分,也有小數部分,則分開進行轉換即可。
1.2.2.2 二進位轉換為十進位 二進位轉換為十進位採用的方法是:數字乘位權相加法。下面先以十進位為例來說明該方法,例如十進位數字345的值,5的位權是1,4的位權是10,3的位權是100,則有如下運算式成立: 345=5 × 1 + 4 × 10 + 3 × 100,這就是數字乘位權相加法的原理。 其實對於十進位整數的位權很有規則,從右向左第n位的位權是十的(n-1)方,例如個位是10(1-1),十位是10(2-1),依次類推。那麼二進位整數的位權規律和這個一致,也就是從右向左第n位的位權是二的(n-1)方。 例如二進位整數1011轉換為十進位的運算式為: [1011]2 = 1 × 20 + 1 × 21 + 0 × 22 + 1 × 23 = 1 + 2 + 0 + 8=11 而對於二進位的小數,也是採用一樣的方法,只是二進位小數的位權規則為,小數點後第一位小數的位權是2的-1次方,第二位是2的-2次方,依次類推。 例如二進位小數0.1101轉換為十進位小數的運算式為 [0.1101]2=1 ×2-1 + 1 ×2-2 + 0 × 2-3 + 1 × 2-4 = 0.5 + 0.25 + 0 + 0.0625=0.8125 同理,如果二進位包含整數和小數部分,則分開進行轉換即可。
1.2.3 二進位和八進位、十六進位之間的轉換 雖然二進位是電腦內部的資料表達形式,但是由於二進位基數太少,則導致數字比較長,為了簡化數位書寫,就建立了八進位和十六進位。八進位和十六進位就是對二進位的簡化,所以二進位到八進位和十六進位的轉換非常簡單。 二進位整數轉換為八進位的方法是“三位一併“,也就是從右側開始,每3位位元字轉換為八進位的一位,依次類推,因為二進位的三位元字可以表達的區間是000-111,剛好和0-7重合。例如: 二進位的10111轉換為8進位為:最後三位111轉換為7,前面的數字10轉換為2,則轉換後得到的八位元字為27。 二進位整數轉換為十六進位的方法是“四位一併“,例如10111轉換為十六進位是0111轉換為7,1轉換為1,則轉換後得到的十六進位數字是17。 二進位小數轉換為八進位的方法也是“三位一併“,只是轉換時從小數的高位開始,也就是小數的左側開始。例如0.10111轉換為八進位是101轉換為5,110轉換為6,則轉換得到的八進位小數為0.56。需要特別注意的是,小數最後如果不足三位,一定要在後續補零以後再進行轉換。 二進位小數轉換為十六進位的方法也是“四位一併”,只是轉換時從小數的高位開始。例如二進位小數0.10111轉換為十六進位小數為,1011轉換為b,1000轉換為8,則轉換後得到的十六進位是0.b8。 如果位元包含整數和小數部分,則分開進行轉換。