二進制和十六進制

課程導言

【最早的編程語言是二進制語言,也是計算機能夠直接識別的唯一語言。不管用什麼高級語言編寫的程序最後都要轉換爲二進制語言,才能在計算機上執行,因此掌握二進制知識對學習編程語言是非常有幫助的。本篇和同學們探討二進制計數原理以及與十進制、十六進制的轉換。通過本篇的學習,你將瞭解到爲什麼計算機能夠直接識別二進制語言,二進制的計數原理以及與十進制、十六進制之間的數值轉換。】

 

在講述二進制之前,先做一個小遊戲。伸出我們的右手,從小指開始,依次到大拇指分別代表數字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就必須用多位數來表示,並遵循逢十進一的原則。一個任意的十進制數可以表示爲:

blob.png

其含義是:

blob.png

其中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表示blob.png,第二個1表示blob.png

,……,第7個1表示0.001=10-3,每個位數表示的數值叫做位權,也就是基數的n冪。十進制數1111.111以小數點爲界,整數部分自右向左,依次是基數的0次、1次、2次、3次冪。小數部分,自左向右,分別是基數的-1次、-2次、-3次冪。每位數字乘以其權所得的乘積之和即爲所表示數的值。

例如:

blob.png

十進制是人們最熟悉、最常用的一種數制,但它不是唯一的數制。例如計時用的時、分、秒就是按60進制計數的。基數爲r的r進制數可以表示爲:

blob.png

二進制和十六進制數

計算機就其本身來說是一個電器設備,爲了能夠快速存儲、處理、傳遞信息,其內部採用了大量的電子元件,在這些電子元件中,電路的通和斷、電壓高低,這兩種狀態最容易實現,也最穩定、也最容易實現對電路本身的控制。計算機工程師將計算機所能表示這樣的狀態,用0,1來表示、即用二進制數表示計算機內部的所有運算和操作。二進制數運算非常簡單,計算機很容易實現,所以計算機內部都用二進制編碼進行數據的傳送和計算。

二進制的基數爲2,只有0、1兩個數碼,並遵循逢二進一的原則,它的各位權是以2k表示的,因此二進制數blob.png的值爲:

blob.png

其中ai,bj爲0、1兩個數碼中的一個。例如:

blob.png

其中數的下標表示該數的基數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。

按同樣的方法,可以很容易地掌握十六進制數的表示方法。例如:

blob.png

在計算機編程語言中,通常用數字後面跟一個英文字母來表示該數的數制。十進制一般用D(Decimal)、二進制數用B(Binary)、十六進制用H(Hexadecimal)來表示。例如:23AH、570D、110101B、0075H,…。當然也可以用這些字母的小寫形式。

不同進制數的相互轉換

計算機中採用的是二進制,但用計算機解決實際問題時對數值的輸入輸出通常使用十進制,這就有一個十進制向二進制轉換或由二進制向十進制轉換的過程。也就是說,在使用計算機進行數據處理時首先必須把輸入的十進制數轉換成計算機所能接受的二進制數;計算機在運行結束後,再把二進制數轉換爲人們所習慣的十進制數輸出。

1、二進制數轉換成十進制數  

 把二進制數轉換成十進制數就是用“按權相加法”,把二進制數首先寫成加權係數展開式,然後按十進制加法規則求和。

 例:把二進制數110.11轉換成十進制數。 

blob.png

2、十進制數轉換爲二進制數 

  前面“按權相加法”中,權的值在小數點左邊和小數點右邊是不一樣的。所以,十進制數轉換爲二進制數時,整數和小數的轉換方法也不同,一般先把十進制數的整數部分和小數部分分別轉換後,再加以合併。

十進制整數轉換爲二進制整數採用"除2取餘,逆排序"法。具體做法是:用2去除十進制整數,可以得到一個商和餘數;再用2去除商,又會得到一個商和餘數,如此進行,直到商爲零時爲止,然後把所有餘數按逆序排列,也就是把先得到的餘數作爲二進制數的低位有效位,後得到的餘數作爲二進制數的高位有效位,依次排列起來。這就是所謂“除2取餘,逆序排列”。

例:將一個十進制數25轉換爲二進制數。

 

   blob.png           

                               

3、十六進制和二進制之間的轉換

由於十六進制的基數是2的冪,所以這兩種數制之間的轉換是十分容易的。一個二進制數,只要把它從低位到高位每4位組成一組,直接用十六進制數來表示就可了。

例:0011  0101  1011  1111 = 35BF

      3     5     B     F

反之,把十六進制數中的每一位用4位二進制數表示,就形成相應的二進制數了。

              A     1     9     C

例:A19C = 1010  0001  1001  1100

4、十六進制數轉換爲十進制數

同二進制數轉換十進制數相同,各位十六進制數與其對應權值的乘積之和即爲與此十六進制相對應的十進制數。

blob.png

十進制數轉換爲十六進制數也可使用除法進行。

二進制數是逢二進位的進位制,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

 

轉載於編程微課

原文鏈接:二進制和十六進制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章