二進位制數在記憶體中以補碼的形式儲存。
按位取反:二進位制每一位取反,0變1,1變0。
~9的計算步驟:
轉二進位制:0 1001
計算補碼:0 1001
按位取反:1 0110
轉為原碼:
按位取反:1 1001
末位加一:1 1010
符號位為1是負數,即-10
var x = 10;
在計算機中乙個整型數4位元組,1位元組8位,所以數字10在計算機中儲存佔32位,即
00000000 00000000 00000000 00001010,
按位取反,得
11111111 11111111 11111111 11110101,
這個二進位制資料就是「~10」,最高位是1表示它是個負數,那麼我們如何轉化為十制數呢?
這裡又涉及到了負數在計算機裡的儲存問題,計算機裡,負數以其正值的補碼形式存在。
再舉個例子:
-10 ,二進位制表示為
10000000 00000000 00000000 00001010
原碼,取其絕對值也就是10,即
00000000 00000000 00000000 00001010
反碼,按位取反,得
11111111 11111111 11111111 11110101
補碼,即將反碼加1,得
11111111 11111111 11111111 11110110
至此,我們得到了計算機中-10的二進位制儲存形式。
然後我們再回到上乙個問題,我們怎麼根據計算機中的補碼得到這個負數呢?
我們可以按原路返回,就是將計算機中儲存的二進位制補碼減1,然後取反,再得到原碼,換成相應負數即可,不過這樣有點麻煩,因為涉及到了減法操作。
另一種方法,將負數的補碼先取反,然後加1,最高位置換為1即可。
對於~10,在計算機中儲存為
11111111 11111111 11111111 11110101 (這是10取反的結果,但卻是未知數x的補碼形式)
先取反,得
00000000 00000000 00000000 00001010 (此處,再次取反,返回10)
再加1,得
00000000 00000000 00000000 00001011 (10+1得11)
最高位變1,即
10000000 00000000 00000000 00001011 (取相反數即-11)
結果是「-11」
由此我們可以看出規律:「~x」的結果為「-(x+1)」
math.abs(~2016) = 2017
~表示按位取反,math.abs函式表示取絕對值.
10進製數2016,轉32位2進製數為:0000 0111 1110 0000
~按位取反:1111 1000 0001 1111,對應十進位制數:-2017
math.abs(-2017)=2017
所以「~2018」就等於「-2019」,math.abs(-2019)即2019
python 中按原碼取反 按位取反
在python中,按位運算的結果與c c 中位運算結果不同,原因主要是c c 是按原碼來取反。而在python中,取反的運算的流程是這樣的 先獲得其二進位制 原碼 進行取反操作。將第一步的結果,當作補碼。求這個補碼的原碼,這個原碼就是輸出的結果。補 碼求原碼的過程,先減1,再取反。由於是這樣的邏輯,...
按位取反 100 101
首先看等號左邊 100 的二進位制表示為 0110 0100 按位取反的意思就是每一位取反,0變1,1變0 所以 100 的二進位制表示為 1001 1011 所以等號左邊 1001 1011 再看右邊 101.一旦看到出現負數,那麼這個數一定是按有符號數的規則來表示的。乙個二進位制數 按位取反並加...
按位與 按位異或 按位取反
按位與 按位或 按位異或 1.按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例如 9 5可寫算式如下 00001001 9的二進位制補碼 00000101 5的二進位制補碼 0000...