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


0、開篇

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

1、用二進制數表示計算機信息的原因

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

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

2、什么是二進制數

    為了能更清晰地說明二進制數的機制,首先需要明白二進制轉換成十進制的實際步驟。
    二進制數的值轉換成十進制的值,只需將二進制數的各數位的值與位權相乘,然后將相乘的結果相加即可。
    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。

3、移位運算和乘除運算的關系

    在了解了二進制數的機制后,接下來我們來看一下運算。和十進制數一樣,四則運算同樣也可以使用在二進制數中。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/2、1/4、1/8。

4、便於計算機處理的“補數”

    上一小節說了,右移的操作說明會在后續說明,這里就是后續了。先補充一個知識點:計算機在做減法運算時,實際上內部是在做加法運算的。
    右移后空出來的高位數值,有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)

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

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

6、掌握邏輯運算的竅門

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM