原碼,反碼,補碼,移位


https://www.cnblogs.com/btgyoyo/p/6371398.html

復習下二進制的有關知識

1.所有的數據都是以二進制的形式存儲在硬盤上。對於一個字節的8位到底是什么類型 計算機是如何分辨的呢? 其實計算機並不負責判斷數據類型,數據類型是程序告訴計算機該如何解釋內存塊.

2.對於字符的存儲,先將字符轉化成其字符集的碼點,(碼點就是一個數字),然后把該數字轉成2進制存儲。所以我們只要記得數字的存儲就ok了。字符的碼點程序采用無符號處理,即沒有符號位,數值型默認都是有符號位的。

1個字節的最高位是符號位所以一個數字能夠存儲的范圍是-128-127

3.原碼

正數5: 0000 0101

負數5: 1000 0101

4.反碼

正數5: 0000 0101

負數5: 1111 1010

5.補碼

正數5: 0000 0101

負數5: 1111 1011(-5在硬盤上的存儲方式)

1.可以看到正數的原碼 與 其反碼補碼相同
2.負數的原碼最高位為1
3.負數的反碼: 符號位不變,其余各位按位取反
4.負數的補碼:在其反碼的基礎上+1
5.負數是以其補碼的方式存儲在硬盤上的

 

 6.左移操作(<<)

復制代碼
規則:
右邊空出的位用0填補
高位左移溢出則舍棄該高位。
計算機中常用補碼表示數據:
數據 127,補碼和原碼一樣:0111 1111。

左移一位: 1111 1110   -> 這個補碼對應的原碼為:1000 0010  對應十進制:-2
左移二位: 1111 1100   -> 這個補碼對應的原碼為:1000 0100  對應十進制:-4
左移三位: 1111 1000   -> 這個補碼對應的原碼為:1000 1000  對應十進制:-8
左移四位: 1111 0000   -> 這個補碼對應的原碼為:1001 0000  對應十進制:-16
左移五位: 1110 0000   -> 這個補碼對應的原碼為:1010 0000  對應十進制:-32
左移六位: 1100 0000   -> 這個補碼對應的原碼為:1100 0000  對應十進制:-64
左移七位: 1000 0000   -> 這個補碼對應的原碼為:1000 0000  對應十進制:-128
左移八位: 0000 0000   -> 這個補碼對應的原碼為:0000 0000  對應十進制:0
 
 
注:
原碼到補碼的計算方式:取反+1,
補碼到原碼的計算方式:-1再取反。
 
 
 
數據-1,它的原碼為1000 0001,補碼為1111 1111
左移一位: 1111 1110   -> 這個補碼對應的原碼為:1000 0010  對應十進制:-2
左移二位: 1111 1100   -> 這個補碼對應的原碼為:1000 0100  對應十進制:-4
左移三位: 1111 1000   -> 這個補碼對應的原碼為:1000 1000  對應十進制:-8
左移四位: 1111 0000   -> 這個補碼對應的原碼為:1001 0000  對應十進制:-16
左移五位: 1110 0000   -> 這個補碼對應的原碼為:1010 0000  對應十進制:-32
左移六位: 1100 0000   -> 這個補碼對應的原碼為:1100 0000  對應十進制:-64
左移七位: 1000 0000   -> 這個補碼對應的原碼為:1000 0000  對應十進制:-128
左移八位: 0000 0000   -> 這個補碼對應的原碼為:0000 0000  對應十進制:0
 
可以看出127和-1的結果完全一樣。移位操作與正負數無關,它只是忠實的將所有位進行移動,補0,舍棄操作。
復制代碼

 

7.右移操作( >>)

復制代碼
規則:
左邊空出的位用0或者1填補。正數用0填補,負數用1填補。注:不同的環境填補方式可能不同;
低位右移溢出則舍棄該位。

1、127的補碼:0111 1111
右移一位: 0011 1111 -> 原碼同補碼一樣 對應十進制:63
右移二位: 0001 1111 -> 原碼同補碼一樣 對應十進制:31
右移三位: 0000 1111 -> 原碼同補碼一樣 對應十進制:15
右移四位: 0000 0111 -> 原碼同補碼一樣 對應十進制:7
右移五位: 0000 0011 -> 原碼同補碼一樣 對應十進制:3
右移六位: 0000 0001 -> 原碼同補碼一樣 對應十進制:1
右移七位: 0000 0000 -> 原碼同補碼一樣 對應十進制:0
右移八位: 0000 0000 -> 原碼同補碼一樣 對應十進制:0
2、-128的補碼:1000 0000
右移一位: 1100 0000 -> 這個補碼對應的原碼為:1100 0000 對應十進制:-64
右移二位: 1110 0000 -> 這個補碼對應的原碼為:1010 0000 對應十進制:-32
右移三位: 1111 0000 -> 這個補碼對應的原碼為:1001 0000 對應十進制:-16
右移四位: 1111 1000 -> 這個補碼對應的原碼為:1000 1000 對應十進制:-8
右移五位: 1111 1100 -> 這個補碼對應的原碼為:1000 0100 對應十進制:-4
右移六位: 1111 1110 -> 這個補碼對應的原碼為:1000 0010 對應十進制:-2
右移七位: 1111 1111 -> 這個補碼對應的原碼為:1000 0001 對應十進制:-1
右移八位: 1111 1111 -> 這個補碼對應的原碼為:1000 0001 對應十進制:-1
常見應用
左移相當於*2,只是要注意邊界問題。如char a = 65; a<<1 按照*2來算為130;但有符號char的取值范圍-128~127,已經越界,多超出了3個數值,所以從-128算起的第三個數值-126才是a<<1的正確結果。
而右移相當於除以2,只是要注意移位比較多的時候結果會趨近去一個非常小的數,如上面結果中的-1,0。


免責聲明!

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



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