原碼、補碼和反碼 & 邏輯位移和算術位移


1. 無符號數、補碼、反碼、原碼

對於向量x=[xw-1,xw-2,...,x0], 其中xi取0或1

無符號數                  

 

 

 

 原碼:

最高位表示符號位,其余位表示值 。例如,[1111 1111, 0111 1111] = [-127,127] 

  反碼:      

正數的補碼是其本身,而負數的補碼是在原碼的基礎上,最高位不變,其他位取反。

   補碼:

正數的補碼是其本身,而負數的補碼是在原碼的基礎上,最高位不變,其他位取反,最后加1(即在反碼的基礎上加1)。


 

 2. 區分補碼、原碼和反碼的意義

使用原碼時,人腦可以理解最高位代表正負號的含義,但是對於機器來說,在識別數字的同時還有區分出正負號,會對機器帶來極大的負擔。

於是使用補碼和反碼來幫助機器理解如何將符號位加入運算。

反碼的出現時為了解決原碼做減法的問題

例如計算:1-1 = 1+(-1)=[0000 0001]+[1000 0001] = [0000 0001]+[1111 1110] = [1111 1111] = [1000 0000] = -0

然而,在實際中並沒有對-0和+0進行區分,因而引入了補碼來解決0的符號問題

例如計算:1-1 = 1+(-1)=[0000 0001]+[1000 0001] = [0000 0001]+[1111 1111] = [0000 0000] = [0000 0000] = 0

除此之外:(-1)+(-127) = [1000 0001]+[1111 1111] = [1111 1111]+[1000 0001] = [1000 0000] = -128 

從而使用補碼,還能多表示一個最低數。因而,使用原碼和反碼表示的范圍為[-127,127],而使用補碼時范圍為[-128,127]


3. 移位運算

對於左移操作(<<)而言。不管是有符號數還是無符號數,x<<k,都是對於x而言,丟棄最高K位,並在右邊末端添上k個0。

而對於右移操作(>>)而言,則分為邏輯右移和算術右移。其中邏輯右移在左端補k個0,而算術右移則是在左端補上k個最高位。

操作
x [1001 0101]
x << 4 [0101 0000]
x >> 4(邏輯右移) [0000 1001]
x >> 4 (算術右移) [1111 1001]

 (以下二進制均為補碼表示,即移位是用補碼進行的(這是因為計算機中用的是補碼表示))

 

 

左移操作相當於乘以2的k次方;而右移操作相當於除以2的k次方 (均只適用於被舍棄的高位不含1的情況)

 


免責聲明!

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



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