課程導言
【最早的編程語言是二進制語言,也是計算機能夠直接識別的唯一語言。不管用什么高級語言編寫的程序最后都要轉換為二進制語言,才能在計算機上執行,因此掌握二進制知識對學習編程語言是非常有幫助的。本篇和同學們探討二進制計數原理以及與十進制、十六進制的轉換。通過本篇的學習,你將了解到為什么計算機能夠直接識別二進制語言,二進制的計數原理以及與十進制、十六進制之間的數值轉換。】
在講述二進制之前,先做一個小游戲。伸出我們的右手,從小指開始,依次到大拇指分別代表數字1、2、4、8、16。並且每個手指分為兩種狀態,手指伸直為1狀態,手指彎曲為0狀態。然后分別做每個手指自由伸直或彎曲動作,記錄其狀態和每個手指的數字之和,狀態順序從大拇指開始:
(1)動作:伸直小指、中指和大拇指,彎曲無名指和食指。
狀態:10101
數字之和:21
(2)動作:伸直小指、無名指和中指,彎曲大拇指和食指。
狀態:00111
數字之和:7
(3)動作:伸直全部手指。
狀態:11111
數字之和:31
有同學可能會問,做這個游戲的意義在什么地方呢?這個游戲用直觀化的方式演示了二進制數到十進制數的轉換,五個手指的伸直和彎曲的狀態組合用0和1表述出來,就是我們本課程要探討的二進制數,游戲中記錄的數字之和就是二進制數的十進制表示。
前面的游戲可以把5個二進制數轉換為十進制數,同樣的道理,也可以把30以內的十進制數轉換為二進制數。只需要把十進制數分解成16、8、4、2、1任意數字之和就可以,然后將對應數字的右手手指伸直,沒有對應數字的右手手指彎曲,從大拇指開始記錄其組合狀態,該組合狀態就是要轉換的二進制數。
例如:
十進制數字:5=4+1 對應的二進制數為:00101
十進制數字:28=16+8+4 對應的二進制數為:11100
前面的游戲能不能實現更多二進制數的轉換呢?當然可以,右手五個手指表示5個二進制數,如果再加上左手就可以表示10個二進制數了,所能表示的十進制數也更大。依次類推,多人合作可以表示更多位的二進制數和更大的十進制數。
從前面的游戲中可以看出,二進制數只有兩個狀態0和1,二進制數的這個特質非常適合描述電路的通與短、開關的打開與關閉,計算機的電路都是由電子器件組成的,電子器件的狀態也分為0(低電位)和1(高電位),二進制的特征正好滿足了計算機中電子器件的運算要求,因此計算機內部運算都采用二進制運算,能夠識別的數也是二進制數。
計算機能夠識別的數制是二進制數,二進制數是用0和1兩個數字來表示的數,計算機的指令集也是采用二進制表示,機器語言就是用二進制數來編寫程序。
可以借助十進制數來理解二進制數。在十進制中,最開始學習的是十以內的加法,之后是兩位數的加法,在兩位數加法的學習中,就需要逢十進一了,按進位的原則進行記數的方法叫做進位記數制,也稱為“數制”或“進制”。
我們平時用的最多的就是十進制,時間是六十進制,也就是說逢六十進一,例如60秒進1分,60分進1小時。因此每一種數制的進位都遵循一個規則,那就是——逢n進1。這里的n叫做基數。
在十進制中,每一位有0、1、2、3、4、5、6、7、8、9十個數碼,因此基數為10,超過9就必須用多位數來表示,並遵循逢十進一的原則。一個任意的十進制數可以表示為:
其含義是:
其中ai(i=0,1…,n),bj(j=1,2,…,m)是0、1、2、3、4、5、6、7、8、9十個數碼中的一個。
上式中相應於每位數字的10n稱為該數字的權,其大小是以基數為底,數碼所在位置的序號為指數的整數次冪。
例如:十進制數1111.111
這個十進制數的7個位數雖然都是1,但是每個位數1表示的數值意義不同,從左往右數第一個1表示,第二個1表示
,……,第7個1表示0.001=10-3,每個位數表示的數值叫做位權,也就是基數的n冪。十進制數1111.111以小數點為界,整數部分自右向左,依次是基數的0次、1次、2次、3次冪。小數部分,自左向右,分別是基數的-1次、-2次、-3次冪。每位數字乘以其權所得的乘積之和即為所表示數的值。
例如:
十進制是人們最熟悉、最常用的一種數制,但它不是唯一的數制。例如計時用的時、分、秒就是按60進制計數的。基數為r的r進制數可以表示為:
二進制和十六進制數
計算機就其本身來說是一個電器設備,為了能夠快速存儲、處理、傳遞信息,其內部采用了大量的電子元件,在這些電子元件中,電路的通和斷、電壓高低,這兩種狀態最容易實現,也最穩定、也最容易實現對電路本身的控制。計算機工程師將計算機所能表示這樣的狀態,用0,1來表示、即用二進制數表示計算機內部的所有運算和操作。二進制數運算非常簡單,計算機很容易實現,所以計算機內部都用二進制編碼進行數據的傳送和計算。
二進制的基數為2,只有0、1兩個數碼,並遵循逢二進一的原則,它的各位權是以2k表示的,因此二進制數的值為:
其中ai,bj為0、1兩個數碼中的一個。例如:
其中數的下標表示該數的基數r,即二進制的101101與十進制的45等值。
n位的二進制數可以表示2n個數。例如:3位二進制數可以表示8個數,分別是:
-
二進制數 相對應的十進制數
-
000 0
-
001 1
-
010 2
-
011 3
-
100 4
-
101 5
-
110 6
-
111 7
而4位二進制數則能表示十進制的0 ~ 15共16個數如下:
二進制數 相對應的十進制數
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
為了方便閱讀及書寫,經常使用十六進制來表示二進制數,十六進制的基數是16,數碼為0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,其中用A,B,C,D,E,F(字母不區分大小寫)這六個字母來分別表示10,11,12,13,14,15。
按同樣的方法,可以很容易地掌握十六進制數的表示方法。例如:
在計算機編程語言中,通常用數字后面跟一個英文字母來表示該數的數制。十進制一般用D(Decimal)、二進制數用B(Binary)、十六進制用H(Hexadecimal)來表示。例如:23AH、570D、110101B、0075H,…。當然也可以用這些字母的小寫形式。
不同進制數的相互轉換
計算機中采用的是二進制,但用計算機解決實際問題時對數值的輸入輸出通常使用十進制,這就有一個十進制向二進制轉換或由二進制向十進制轉換的過程。也就是說,在使用計算機進行數據處理時首先必須把輸入的十進制數轉換成計算機所能接受的二進制數;計算機在運行結束后,再把二進制數轉換為人們所習慣的十進制數輸出。
1、二進制數轉換成十進制數
把二進制數轉換成十進制數就是用“按權相加法”,把二進制數首先寫成加權系數展開式,然后按十進制加法規則求和。
例:把二進制數110.11轉換成十進制數。
2、十進制數轉換為二進制數
前面“按權相加法”中,權的值在小數點左邊和小數點右邊是不一樣的。所以,十進制數轉換為二進制數時,整數和小數的轉換方法也不同,一般先把十進制數的整數部分和小數部分分別轉換后,再加以合並。
十進制整數轉換為二進制整數采用"除2取余,逆排序"法。具體做法是:用2去除十進制整數,可以得到一個商和余數;再用2去除商,又會得到一個商和余數,如此進行,直到商為零時為止,然后把所有余數按逆序排列,也就是把先得到的余數作為二進制數的低位有效位,后得到的余數作為二進制數的高位有效位,依次排列起來。這就是所謂“除2取余,逆序排列”。
例:將一個十進制數25轉換為二進制數。
3、十六進制和二進制之間的轉換
由於十六進制的基數是2的冪,所以這兩種數制之間的轉換是十分容易的。一個二進制數,只要把它從低位到高位每4位組成一組,直接用十六進制數來表示就可了。
例:0011 0101 1011 1111 = 35BF
3 5 B F
反之,把十六進制數中的每一位用4位二進制數表示,就形成相應的二進制數了。
A 1 9 C
例:A19C = 1010 0001 1001 1100
4、十六進制數轉換為十進制數
同二進制數轉換十進制數相同,各位十六進制數與其對應權值的乘積之和即為與此十六進制相對應的十進制數。
十進制數轉換為十六進制數也可使用除法進行。
二進制數是逢二進位的進位制,0、1是基本算符,計算機運算基礎采用二進制。編程過程中經常會用到十六進制,而十進制的使用非常少,這是因為十六進制和二進制有天然的聯系:四個二進制位可以表示從0到15的數字,這剛好是1個16進制位可以表示的數據,也就是說,將二進制轉換成十六進制只要每4位進行轉換就可以了。
■ 課程小結
1、二進制只有兩個數字,就是0和1,類似開關的接通和斷開。計算機里面的芯片都是電子電路,也只有兩種狀態,高電位(通電)和低電位(斷電),因此用二進制表示電子電路的狀態是最合適不過了,不用任何翻譯過程,電子電路會自動識別用二進制語言寫的代碼。
2、二進制和其它進制是可以互相轉換的,如十進制和十六進制,具體轉換方法課程已經介紹的比較詳細了。這里主要說一說為什么進制間要相互轉換?我們知道計算機內部是用二進制表示的,但人們用計算機工作時,輸入的都是十進制數和字符,這就需要把人們輸入的數據通過處理程序轉換為計算機能夠識別的二進制數。同樣的道理,當人們需要從計算機查詢信息時,處理程序就需要把二進制數轉換成人們能夠容易識別的十進制數或者字符。
從轉換過程看,好像沒有十六進制的事,其實十六進制是為了方便編程人員編寫代碼而提供的,主要是在編程語言中,用十六進制表示數值特別方便,可以以較少的數位表示較大的數,而且十六進制和二進制的轉換也非常方便,因此程序員更喜歡在代碼中用十六進制表示數值。
■ 思考與練習
1、將下列二進制數轉換為十六進制數和十進制數:
(1)10101 (2)10000000 (3)11111111
2、用除法將下列十進制數轉換為二進制數和十六進制數:
(1)369 (2)10000 (3)4095
3、將下列十六進制數轉換為二進制數和十進制數:
(1)FA (2)5B (3)F234