~ 按位取反運算解析
今天我在看簡明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的部落格】
相關文章
- Java中按位取反運算子Java
- C# ~按位取反運算子C#
- 位運算子之---按位取反運算子(簡單易懂)
- 位操作(取反)
- 對十進位制數字的按位輸出,取反,並求其位數
- 學懂模運算 負數的補碼為什麼要按位取反再加一
- opencv入門系列教學(六)影像上的算術運算(加法、融合、按位運算)OpenCV
- 二進位制、位運算、位移運算
- 二進位制取反
- 位運算
- JavaScript | 按位或運算子JavaScript
- JavaScript & 按位與運算子JavaScript
- JavaScript ~ 按位非運算子JavaScript
- 位運算 --20240310
- 理解位運算
- JavaScript ^ 按位異或運算子JavaScript
- 使用位運算進行加法運算
- Java 16進位制字串 取反Java字串
- day14.邏輯運算,位運算
- js中 ~(按位非)運算子妙用JS
- PHP 位運算使用PHP
- 位運算小結
- 位運算-異或(^)
- 位運算總結
- 【SSLOJ 3348】位運算
- 巧用JS位運算JS
- 學習位運算
- 位運算進階
- java二進位制運算十進位制(精確運算)Java
- 計算機基礎:位運算計算機
- 深入理解按位異或運算子
- 位運算簡單操作
- Java中的位運算Java
- 位運算子的計算
- 神奇的位非運算
- JS中的位運算JS
- 位運算的應用
- Java位運算小節Java
- C語言位運算C語言