晚上的時候,無心之間看到stackoverflow上面的一個編程挑戰賽,各路高手各類搞事,看到python的地方忽然發現用了不少位運算的符號,可是~符號引發了我和同事的注意。python
咱們不多在程序中使用這種東西,一個是可讀性問題,二是感受不是很熟練因而興致來了,便探究一番~取反運算。編程
首先看看行爲spa
In [1]: ~3
Out[1]: -4
取反3等於-4,那麼是如何進行計算的呢?code
首先咱們知道3的二進制用8bit表示爲 0000 0011 那麼對這個數進行二進制取反獲得 1111 1100 這點來講應該不會有什麼理解上的問題。blog
可是到這裏,若是已經忘記或者不知道負數在計算機中是以補碼形式表示的盆友(好比我這個菜🐔)就會疑惑了 1111 1100 並非-4啊???怎麼回事。源碼
如今計算機廣泛使用補碼錶示負數,因此如今問題變成了 一個數x的補碼等於1111 1100 咱們要求這個x。it
知道一個數的補碼 要求其值的方法是 首先看符號位也就是最左的一位,若是是1表明是負數(-)若是是0代碼是正數(+),而後對該值取反+1獲得其源碼class
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