原碼,反碼,補碼詳解及如何計算二進位制數中1的數量

2021-09-24 21:43:31 字數 2361 閱讀 1841

我們都知道計算機無法直接識別十進位制數,所以我們要先把十進位制數轉換成二進位制數存在記憶體中才能進行相應的計算。而原碼,反碼,補碼就是計算機儲存乙個具體數字的編碼方式。

原碼:原碼就是符號位加上真值的絕對值,即第一位是符號位,其餘位表示值。

反碼:正數的反碼是其本身,負數的反碼是在其原碼的基礎上,符號位不變,其餘各個位取反。

補碼:正數的補碼是它本身,負數的補碼是在其原碼的基礎上,符號位不變,其餘各個位取反,最後在加上個1。

現在我們知道了計算機有三種編碼方式來表示同乙個數,對於正數原碼、反碼、補碼完全相同,而對於負數三者完全不同。既然對於人腦來說,原碼是可以被直接理解和識別的編碼方式,為何還會出現反碼和補碼呢?

首先,對於乙個二進位制數,人腦可以知道第一位是符號位,根據其符號位對真值進行加減。但對於計算機來說辨別乙個二進位制數的符號位必定會使讓計算機的基礎電路設計變得十分複雜。所以人們就想出乙個辦法,讓符號位也參與到運算中。我們都知道減去乙個正數,相當於加上乙個負數,所以在機器中可以只有加法而沒有減法,這樣計算機的運算就變得更加簡單了。

原碼計算

那麼如果讓符號位參與到運算中來,直接使用原碼來進行加法計算,結果肯定是不正確的。這也就是為什麼在計算機的內部為何不用原碼來表示乙個數。

反碼計算

十進位制計算:1-1=0

二進位制計算:1-1=1+(-1)= [0000 0001]原+[1000 0001]原=[0000 0001]反+[1111 1110]反=[1111 1111]反=[1000 0000]原=-0

而我們發現用反碼來進行運算時,結果的真值部分是正確的,而唯一的問題就出現在0這個特殊值身上。在理解上,-0和+0都是0,有兩個編碼來表示0分別是[0000 0000]和[1000 0000]。為了解決這個-0的問題補碼應運而生。

補碼計算

十進位制計算:1-1=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]補

在這裡,補碼中的[1000 0000]我們把它當成-128,實際上是把-0的補碼來表示-128。ps:補碼[1000 0000]的原碼算出來是[0000 0000],而[0000 0000]的補碼應該是[0000 0000],所以這樣計算是不正確的。在補碼中-128是沒有對映的原碼和反碼的。

因此,使用補碼不僅解決了0的符號和原碼和反碼中存在的問題,還能多表示乙個數字-128。這樣我們也可以很好的解釋為什麼8位二進位制數原碼和反碼的範圍均為[-127, 127],而補碼的範圍為[-128, 127]。而對於我們在程式設計中使用的32位整型數字,在機器也是用補碼表示,所以它的範圍可以表示為[-231, 231-1],補碼又可以表示乙個最小值-231。

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。

//僅試用於正數的解法,對於負數來說可能會陷入死迴圈

public

class

solution

n=n>>1;

}return num;

}}

下面這種方法對上述方法進行改進,對所有二進位制整數都適用,:

//此次我們選擇對1進行左移來和二進位制數的每位進行比較

public

class

solution

one=one<<1;

}return num;

}}

最優解:

//這個方法十分巧妙

public

class

solution

return num;

}}

解析:如果乙個整數不為零,那麼二進位制形式中必然有1。我們把這個整數減一,相當於把最右端的1變成0,而這個1後面的0全都變為了1,在與原數字進行與運算可以消除最後一位1,能夠消除幾次,則這個二進位制整數中所含的1的數量就是多少。直至這個而二進位制整數變成零。

舉個例子:二進位制1110 0000減1等於1101 1111,再與原二進位制數進行與運算,可得到1100 0000,1100 0000減1再和1100 0000進行與運算可得1000 0000,繼續做相同的運算,我們可知,做三次這樣的運算,原數字1110 0000變為0000 0000。因此此方法可以用於計算二進位制整數中1的數量。

二進位制原碼 反碼 補碼詳解

原碼 原碼是指將最高位作為符號位 0表示正,1表示負 其它數字位代表數值本身的絕對值的數字表示方式。例如 數字6 在計算機中原碼表示為 0 000 0110 其中,第乙個數字0是符號位,0表示正數,0 000110是數字6的二進位制資料表示。數字 6 在計算機中原碼表示為 1 000 0110 以上...

計算機原碼 反碼 補碼詳解

機器數乙個數在計算機中的二進位制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為0,負數為1.比如,十進位制中的數 3 計算機字長為8位,轉換成二進位制就是00000011。如果是 3 就是 10000011 那麼,這裡的 00000011 和 1000001...

計算機原碼 反碼 補碼詳解

乙個數在計算機中的二進位制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為0,負數為1.比如,十進位制中的數 3 計算機字長為8位,轉換成二進位制就是00000011。如果是 3 就是 10000011 那麼,這裡的 00000011 和 10000011 就...