~ 按位取反運算解析

gamedev˚發表於2018-01-28

今天我在看簡明Python指南的時候,看到其中一個計算機計算的問題,它是這樣描述的:

x的按位取反結果為-(x+1)
~5 輸出 -6。有關本例的更多細節可以參閱:http://stackoverflow.com/a/11810203

看到這兒我就疑惑了,之前在大學中學習的計算機基礎課程又還給教材了,hhh…
無奈,我只好取網上搜尋解析的答案,而網上的解釋說得不太讓人明白,自己結合他人的解釋進行了一番整理,把思路排版出來,供後來者參閱:


首先要明確的一點是,計算機內部在做數學運算時(也就是計算機的0和1的運算),都是以補碼為標準的,說白了 計算機中就一種碼那就是補碼,而現實社會中的編碼規則,例如原碼、反碼都是我們自定義的,為了和計算機中的補碼形成轉換關係。所以說在我們手工計算這類由計算機計算的01運算,要站在計算機的角度。因此首先就要將我們的原碼反碼什麼的全都先轉為補碼,再來計算_。這樣才能使得正數和負數的表示統一起來,具體可以參閱【補碼的歷史】,這裡不過多展開了。
接著來看那個問題,從問題入手,解決了實際問題,概念也就自然瞭然於心了。_

5的補碼是它本身(ps:正數的原、反、補碼都是它本身;負數的原碼最高為為1開頭,反碼是最高符號位不變,其餘位在原碼的基礎上取反,補碼是在反碼的基礎上+1即可得到)
5的補碼:00000101

~5 (也就是5按位取反運算,下面涉及的是補碼運算):
00000101按位取反,這裡需要將原始01串完全反轉過來,不存在最高符號位的概念,取反結果為: 11111010

注意這裡的結果是用補碼錶示的,畢竟這還是機器表示形式,轉化為自然語言的編碼,把結果轉化為原碼就是:
補碼-1轉為反碼: 11111010 - 1 = 11111001
反碼再取反轉為原碼:11111001 = 10000110
原碼轉為十進位制,答案就是-6

按位取反的快捷運算公式 -(x+1),至於這個公式怎樣推理出來的,這裡不作介紹。
關於~x=-(x+1)的證明,有興趣的可以看看這篇:https://www.cnblogs.com/zjutzz/p/10646760.html。懂原理才能記得牢固,一個快捷計算公式只是為了計算時方便。

轉載請註明出處:http://blog.csdn.net/coder__cs/article/details/79186677
本文出自【elon33的部落格

相關文章