Python的按位取反運算符~的解釋是:
對數據的每個二進制位取反,即把1變爲0,把0變爲1。~x 類似於 -x-1。
如a =61= 0b0011 1101,按位取反後的結果是:0b1100 0010=194,
可是Python中運算結果並非如此,
輸出的~a的結果是:~a=62
這是怎麼回事呢?
計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同。
在計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。
另外,求負整數的補碼,將其對應正數二進制原碼錶示所有位取反(包括符號位,0變1,1變0)後加1
這裏用括號來表示符號位,0表示正數,1表示負數。
a=61=(0)0b0011 1101,正數補碼
~a=(1)0b1100 0010,負數補碼,符號位爲1表示這個代表一個負數,我們要知道其表示的數值。
對應負數原碼到補碼的轉換過程:
(1)數值部分先減一:0b1100 0001
(2)數值部分取反:0b0011 1110,數值部分62
加上符號則~a =-62= (1)0b0011 1110,負數原碼