按位取反運算解析

2021-08-15 03:14:33 字數 1105 閱讀 3921

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

x的按位取反結果為-(x+1)

~5 輸出 -6。有關本例的更多細節可以參閱:

看到這兒我就疑惑了,之前在大學中學習的計算機基礎課程又還給教材了,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)的證明,有興趣的可以看看這篇:懂原理才能記得牢固,乙個快捷計算公式只是為了計算時方便。

本文出自【elon33的部落格】

JAVA按位取反運算

按位取反是對補碼進行運算,當運算完後,再將補碼變回原碼。這個符號為按位取反運算子。按位取反的運算規則為0變成1,1變成0.0 1,1 0 有這麼乙個題 1.求 9的結果是什麼 解 9的二進位制數表示 0000 1001 9的原碼 0000 1001 9的反碼 0000 1001 9的補碼 0000 ...

python 中按原碼取反 按位取反

在python中,按位運算的結果與c c 中位運算結果不同,原因主要是c c 是按原碼來取反。而在python中,取反的運算的流程是這樣的 先獲得其二進位制 原碼 進行取反操作。將第一步的結果,當作補碼。求這個補碼的原碼,這個原碼就是輸出的結果。補 碼求原碼的過程,先減1,再取反。由於是這樣的邏輯,...

按位取反符

二進位制數在記憶體中以補碼的形式儲存。按位取反 二進位制每一位取反,0變1,1變0。9的計算步驟 轉二進位制 0 1001 計算補碼 0 1001 按位取反 1 0110 轉為原碼 按位取反 1 1001 末位加一 1 1010 符號位為1是負數,即 10 var x 10 在計算機中乙個整型數4位...