二:數據是用二進制數表示的

0、開篇

(1)32位是幾個字節?
     4個字節
(2)二進制數01011100轉換成十進制數是多少?
     92
(3)二進制數00001111左移兩位後,會變成原數的幾倍?
    4倍
(4)補碼形式表示的8位二進制數11111111,用十進制數表示的話是多少?
    -1
(5)補碼形式表示的8位二進制數10101010,用16位的二進制數表示的話是多少?
    1111111110101010
(6)反轉部分圖形模式時,使用的是什麼邏輯運算?
    異或運算XOR運算
    在高級語言編寫的程序中,數值、字符串和圖像等信息在計算機內部都是以二進制數值的形式來表現的。
 

一、用二進制數表示計算機信息的緣由

    ① IC:集成電路,有幾種不一樣的形狀,有的像一條黑色蜈蚣,在其兩側有數個乃至數百個引腳;有的則像插花用的針盤,引腳在IC內部並排排列着。IC的全部引腳,只有直流電壓0V或5V連個狀態。也就是說,IC的一個引腳,只能表示兩個狀態。
    
    ② IC的特性,決定了計算機的信息數據只能用二進制數來處理。
    ③ 計算機處理信息的最小單元-位,就至關於二進制中的一位,也就是bit。
        二進制數的位數通常是8位、16位、32位........也就是8的倍數,這是由於計算機所處理的信息的基本單位是8位二進制。8位二進制數被稱爲一個字節。字節是最基本的信息計量單位。位是最小單位,字節是基本單位。內存和磁盤都使用字節單位來存儲和讀寫數據,使用位單位則沒法讀取數據。
    ④ 程序中,即便是用十進制數和文字等記述信息,在編譯後也會轉換成二進制數的值,因此,程序運行時計算機內部處理的也是用二進制數表示的信息。
    

    ⑤對於用二進制數表示的信息,計算機不會區分它是數值、文字仍是某種圖片的模式等。而是根據編寫程序的各位對計算機發出的指示來進行信息的處理(運算)。編程

二、什麼是二進制數

    爲了能更清晰地說明二進制數的機制,首先須要明白二進制轉換成十進制的實際步驟。
    二進制數的值轉換成十進制的值,只需將二進制數的各數位的值與位權相乘,而後將相乘的結果相加便可。
    10進制的39:3*10^1+9*10^0=39
    
    2進制的39:00100111(二進制數)
    (0*2^7)+(0*2^6)+(1*2^5)+(0*2^4)+(0*2^3)+(1*2^2)+(1*2^1)+(1*2^0)
    0+0+32+0+0+4+2+1=39 
   對比上面的兩種轉換方式,你們應該能注意到,不一樣的就只是位權的不一樣而已,十進制的位權是10,而二進制的位權是2。

三、移位運算和乘除運算的關係

    在瞭解了二進制數的機制後,接下來咱們來看一下運算。和十進制數同樣,四則運算一樣也可使用在二進制數中。10進制是逢10進1,而2進制是逢2進1。
    ① 移位運算:將二進制數值的各數位進行左右移位的運算。位移有左移<<(向高位方向)和右移>>(向低位方向)兩種。
        a=39;
        b=a<<2;
    ② 問題來了,左移後低位有空位,右移後高位有空位,怎麼辦,要補上什麼樣的數值呢?
        (1)左移後低位空位都是補0;
        (2)右移後高位補什麼呢?這個後續會說明。
    ③ 將00100111左移兩位的結果是10011100,數值變成了原來的4倍,用十進制表示的話,數值從39變成了156,也正好是4倍。這與十進制的移位運算也是符合的,十進制數左移後也會變成原來的10倍、100倍。1000倍……一樣,二進制數左移後也會變成原來的2倍、4倍、8倍,反之右移就會變成原來的1/二、1/四、1/8。

四、便於計算機處理的「補數」

    上一小節說了,右移的操做說明會在後續說明,這裏就是後續了。先補充一個知識點:計算機在作減法運算時,實際上內部是在作加法運算的。
    右移後空出來的高位數值,有0和1兩種形式,要想區分何時補0何時補1,只要掌握了用二進制數表示負數的方法就能夠了。
    二進制數中表示負數值時,通常會把最高位做爲符號來使用,所以咱們把這個最高位成爲符號位。符號位爲0表示正數,1表示負數。那麼-1用8位二進制數怎麼表示呢,不少人會認爲是10000001,其實這是錯的,二進制表示爲11111111。計算機是用「二進制的補數」來表示負數的。補數就是用整數來表示負數,過程就是:取反+1。所謂取反,就是將各數位的0反轉成1,1取反爲0。你們如今就能夠試試-1的8進製表示形式了。
    補數的思考方式雖然直觀上不易理解,但邏輯上卻很是嚴謹,你們能夠試試1-1的運算,也就是1+(-1)運算。
    

上圖的運算很明顯是錯的,這時,咱們把-1表示成11111111來進行運算。編程語言

     
    爲何使用補數後就能正確地表示負數了呢?你們能夠再詳細的看看上圖,有一個位溢出去了,而溢出的那一位數計算機是不進行處理的。
    有一個法則你們必須牢記:"將二進制數的值取反後加1的結果,和原來的值相加,結果爲0」這個法則。
    總之,要想結果爲0,就必須經過補數來實現。固然,結果不爲0的運算一樣能夠經過使用補數來獲得正確的結果,不過,有一點須要注意,當運算結果爲負數時,計算結果的值也是以補數的形式來表示的。
    3-5的運算:
    3:00000011
    -5:11111011
    00000011+11111011=11111110,最高位變成了1。這就表明結果爲一個負數。那11111110表示的負數是多少呢?負負得正你們都知道,因此經過求解補數的補數,就可知道該值的絕對值。因此11111110,取反後加1後爲00000010,十進制就是2。因此結果就是-2。
    編程語言包含的整數數據類型中,有的能夠表示負數,有的也不能表示。C語言中的unsigned short類型,能表示的範圍就是0~65535。而short類型是-32768~32767.
    你們能夠仔細思考一下-32768~32767這樣負數比正數多一個的緣由。(+0和-0)

五、邏輯右移和算術右移的區別

    開始區分右移高位的區分:
    ① 當二進制數的值表示圖形模式而非數值時,移位後須要在最高位補0、相似於霓虹燈往右滾動的效果,這就成爲邏輯右移。
    
    ② 將二進制數做爲帶符號的數值進行運算時,移位後要在最高位填充移位前符號位的值(0或1)。這就是算術右移。若是數值是用補數表示的負數值,那麼右移後在空出來的最高位補1,就能夠正確地實現1/二、1/4等的運算。若是是正數,就補0。
    
    ③ 只有在右移時才必須區分邏輯位移和算術位移。左移時,不管是圖形模式(邏輯左移)仍是相乘運算(算術左移),都只須要在空出來的低位補0便可。
    ④ 符號擴充:就是指在保持值不變的前提下將其轉換成16位和32位的二進制數。那怎麼擴充呢,很簡單,不論是正數仍是用補數表示的負數,都只需用符號位的值(0或者1)填充高位便可。
    

六、掌握邏輯運算的竅門

    計算機能處理的運算,大致可分爲算術運算與邏輯運算。算術運算是指加減乘除四則運算。邏輯運算是指對二進制數各數字位的0和1分別進行處理的運算,包括邏輯非(NOT運算)、邏輯與(AND運算)、邏輯或(OR運算)和邏輯異或(XOR運算)四種。
    ① 邏輯非指的是0變成一、1變成0的取反操做。
    
    ② 邏輯與指的是「兩個都是1」時,運算結果才爲1,其餘狀況下運算結果都爲0的運算;
    
    ③ 邏輯或指的是「至少有一方是1」時,運算結果爲1,其餘狀況下運算結果都是0的運算;
    
    ④ 邏輯異或指的是排斥相同數值的運算,「兩個數值不一樣」,也就是說,當「其中一方是1,另外一方是0」時運算結果是11,其餘狀況下結果都是0
    
    下圖是對NIKKEI的頭兩個字母NI這一圖形模式進行各類邏輯運算後的結果。假定白色部分表示1,黑色部分表示0。
 

 

相關文章
相關標籤/搜索