因為不可能為每個數值都創造乙個符號,所以需要用基本數字組合出復合的數值,這樣就有了進製的概念。
其實所有進製都是人為的創造,都是用來計數方便的。現在最常用的進製是十進位制,當然其它的進製也在使用中。例如「半斤八兩」這個成語,就反映了古代一斤等於十六兩的概念,也就是十六進製制計數方式。
計算機程式設計中常用的進製有二進位制、八進位制、十進位制和十六進製制,十進位制還是最主要的表達形式。在程式設計中,大家書寫的數值預設為十進位制。
對於進製,有兩個最基本的概念:基數和運算規則。
u基數基數指一種進製中組成的基本數字,也就是不能再拆分的數字。例如十進位制是0-9,二進位制是0和1,八進位制是0-7,十六進製制是0-9,a-f(大小寫均可)。或者可以簡單的這樣記憶,假設是n進製的話,基數就是[0,n-1]的數字,基數的個數和進製值相同,十進位制有十個基數,依次類推。
u運算規則
運算規則就是進製或借位規則,這個類似於一般計算機書籍中位權的概念,例如對於十進位制來說,該規則是「滿十進一,借一當十」,也就是低位的數字滿十了向高位進一,從高位借到的一,相當於低位上的十。其它的進製也是這樣,對於二進位制來說,就是「滿二進一,借一當二」,八進位制和十六進製制也是這樣。
在數學上表示乙個數字是幾進製,通常使用如下格式:[數值]進製數,例如[10]2 表示二進位制數值10。
二進位制是計算機內部資料表示的形式,所以學習計算機程式設計必須熟悉二進位制。熟悉二進位制有以下幾個用途:
u更容易理解計算機的資料儲存方式
計算機內部的很多轉換,例如資料型別之間的強轉,都可以用二進位制解釋最終的結果的值。
u二進位制的運算速度高
二進位制的運算速度比十進位制高的多。例如求2的n次方,通過移位實現的效率比數學方法高效。
u使用二進位制數值進行資料儲存
以二進位制的形式儲存數值,乙個是比較節約資源,可以使用二進位制的位來儲存資訊,例如常見的硬體控制資訊,都是二進位制的形式進行提供的。
如前所述,二進位制包含0和1兩個基數,運算規則是「滿二進一,借一當二」,下面簡單的介紹一下二進位制的計數方式。
例如十進位制的0-9用二進位制進行表達,則依次是:
0,1,10,11,100,101,110,111,1000,1001
說明:數值之間使用逗號進行間隔。
下面是二進位制的一些基本運算結果:
u加法運算
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10
u減法運算
0 – 0 = 0
0 – 1 = -1
1 – 0 = 1
1 – 1 = 0
u乘法運算
0 × 0 = 0
0 × 1 = 0
1 × 0 = 0
1 × 1 = 1
u除法運算
0 / 0 無意義
0 / 1 = 0
1 / 0 無意義
1 / 1 = 1
以下是一些符合的表示式:
110 + 111 =1101
這些基本的運算結構在實際開發中一般不會直接用到,但是通過這些內容可以加深對於二進位制概念的理解。
由於計算機內部的資料是以二進位制進行表達的,而十進位制又是日常生活中最常用的進製,所以它們之間經常需要進行轉換。下面介紹一下轉換的方式。
十進位制整數轉換為二進位制有三種方法,分別是除二取餘、計算器轉換和經驗法。十進位制小數的轉換方法最後做簡單的介紹。
u除二取餘法
除二取餘法是轉換時的最基本方法,也是最通用的方法。規則為:使用十進位制和2去除,取每次得到的商和餘數,用商繼續和2相除,直到商為零為止,第一次得到的餘數作為二進位制的低位,最後一次得到的餘數作為二進位制的高位,由餘數組成的數字就是轉換後二進位制的值。例如十進位制的13轉換為二進位制的計算步驟如下:商餘數
13 / 2 = 6
6 / 2 = 3
3 / 2 = 1
1 / 2 = 0
則計算的最終結果就是1101。
u計算器轉換
windows作業系統中的計算器也可以很方便的實現進製之間的轉換。在程式選單中附件子選單中開啟計算器,從開啟的計算器的檢視選單中,選擇「科學型」,輸入你要轉換的十進位制的數字,例如13,然後介面上數字顯示框西側的「二進位制「,則轉換後的數值就直接顯示在計算器中。
u經驗法
對於二進位制熟悉以後,那麼計算十進位制對應的數字可以通過一些基本的數學變換來實現,在使用經驗法以前,必須熟記2的0-10次方對應的十進位制的值,依次是:
1,2,4,8,16,32,64,128,256,512,1024
則轉換一些特殊的數字時可以極大的提高轉換速度,例如數字65,則可以這樣轉換:
65 = 64 + 1
64對應的二進位制形式為1000000
1對應的二進位制形式為1
則65的二進位制形式為1000001
這個只適合轉換一些特殊的數字,適應性沒有除二取餘法廣泛。
十進位制小數的轉換採用的一般方法是乘二取整法,規則為:對於小數部分先乘二,然後獲得運算結果的整數部分,然後將結果中的小數部分再次乘二,直到小數部分為零為止,則把第一次得到的整數部分作為二進位制小數的高位,後續的整數部分作為地位就是轉換後得到的二進位制小數。需要說明的是,有些十進位制小數無法準確的用二進位制進行表達,所以轉換時符合一定的精度即可,這也是為什麼計算機的浮點數運算不準確的原因。
例如0.25轉換為二進位制小數的步驟如下:
整數部分
0.25 × 2 = 0.5 0
0.5 × 2 = 1.0 1
則0.25轉換為二進位制小數為0.01
如果乙個十進位制數字既有整數部分,也有小數部分,則分開進行轉換即可。
二進位制轉換為十進位制採用的方法是:數字乘位權相加法。下面先以十進位制為例來說明該方法,例如十進位制數字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 × 2(0) + 1 × 2(1) + 0 × 2(2) + 1 × 2(3) = 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
同理,如果二進位制包含整數和小數部分,則分開進行轉換即可。
雖然二進位制是計算機內部的資料表達形式,但是由於二進位制基數太少,則導致數字比較長,為了簡化數字的書寫,就建立了八進位制和十六進製制。八進位制和十六進製制就是對二進位制的簡化,所以二進位製到八進位制和十六進製制的轉換非常簡單。
二進位制整數轉換為八進位制的方法是「三位一併「,也就是從右側開始,每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。
如果二進位制數包含整數和小數部分,則分開進行轉換。
進製間轉換
1.進製間轉換 十進位制轉二進位制 十進位制的數一直除以2,直到商為0,結果為逆序的每個餘數。除2取餘,逆序排列 法,十進位制轉 八 十六進製制同理 十進位制小數轉二進位制小數 小數一直乘以2,直到小數部分為0,結果為順序的每個整數部分。乘2取整,順序排列 法 0.25 10 0.01 2 0.25...
進製間轉換
二進位制 八進位制 十進位制 十六進製制 二進位制 以0b或0b開頭 八進位制 0開頭 077 逢八進一 十進位制 正常表示 逢十進一 十六進製制 以0x開頭 0xff 10 15用 a f 表示 逢十六進一 十進位制 二進位制 對 500 進行轉換 我們先列一組 0000 0000 0000 從右...
進製間轉換
1.進製間轉換 十進位制轉二進位制 十進位制的數一直除以2,直到商為0,結果為逆序的每個餘數。除2取餘,逆序排列 法,十進位制轉 八 十六進製制同理 十進位制小數轉二進位制小數 小數一直乘以2,直到小數部分為0,結果為順序的每個整數部分。乘2取整,順序排列 法 0.25 10 0.01 2 0.25...