晚上的時候,無意之間看到stackoverflow上面的一個編程挑戰賽,各路高手各種搞事,看到python的地方突然發現用了很多位運算的符號,但是~符號引起了我和同事的注意。
我們很少在程序中使用這種東西,一個是可讀性問題,二是感覺不是很熟練於是興致來了,便探究一番~按位取反運算(注意這是一個運算符,跟反碼不是一個東西)。
首先看看行為
In [1]: ~3
Out[1]: -4
取反3等於-4,那么是如何進行計算的呢?
首先我們知道3的二進制用8bit表示為 0000 0011 那么對這個數進行二進制取反得到 1111 1100 這點來說應該不會有什么理解上的問題。
但是到這里,如果已經忘記或者不知道負數在計算機中是以補碼形式表示的盆友(比如我這個菜🐔)就會疑惑了 1111 1100 並不是-4啊???怎么回事。
現在計算機普遍使用補碼表示負數,所以現在問題變成了 一個數x的補碼等於1111 1100 我們要求這個x。
知道一個數的補碼 要求其值的方法是 首先看符號位也就是最左的一位,如果是1代表是負數(-)如果是0代碼是正數(+),然后對該值取反+1得到其源碼
1111 1100 取反 0000 0011 + 1 = 0000 0100 加上符號- 0000 0100 = -4
搞清楚了嗎? 沒有? 我們再看看個負數的反碼
In [3]: ~-4
Out[3]: 3
首先-4 的表示是使用了4的補碼 也就是 0000 0100 的補碼 1111 1100表示,在計算機存儲中這個數表示-4。
然后我們取-4的反碼 也就是取1111 1100的反碼
1111 1100 取反 0000 0011 結果等於3
Reference:
《計算機科學導論》--Behrouz A.Forouzan
原碼, 反碼, 補碼 詳解 https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/computercode.html
