按位取反運計算方法
讀本文前請首先搞懂 “反碼”,“取反”,“按位取反(~)”,這3個概念是不一樣的。
取反:0變1,1變0
反碼:正數的反碼是其本身,對於負數其符號位不變其它各位取反(0變1,1變0)
按位取反(~): 這將是下面要討論的。
“~”運算子在c、c++、java、c#中都有,之前一直沒有遇到這個運算子。
要弄懂這個運算子的計算方法,首先必須明白二進位制數在記憶體中的存放形式,二進位制數在記憶體中是以補碼的形式存放的。
另外正數和負數的補碼不一樣,正數的補碼、反碼都是其本身,既:
正數9:
原碼為: 0000 1001
補碼為: 0000 1001
反碼為: 0000 1001
再例如: -2
求原碼: 1111 0010 (前面4個1表示符號位)
求反碼: 1111 1101 (符號位不變,其餘各位求反)
求補碼: 1111 1110 (符號位不變,末位+1)
所以-2在記憶體中存放為: 1111 1110
-------------------------------------------------------------------------------------------------
弄懂了上述情況後,如何計算就好辦了
假設要對正數9按位取反——> (~9),計算步驟如下,
原碼為 0000 1001,
反碼為 0000 1001,
補碼為 0000 1001,
對其取反 1111 0110(符號位一起進行取反,這不是反碼更加不是最終結果,只是補碼的取反僅此而已)
我們還需要把他轉換成原碼,因為是負數所以進行負數補碼到原碼的逆運算
先減1得反碼: 1111 0101
取反得原碼:1111 1010,(反碼和原碼是一個相對的概念,對反碼取反就是原碼。取反過程符號位是不變的哦)
前面4個1是符號位,1是負數,既得十進位制:-10
不知道說的明不明白,這裡步驟就是:
1. 先對正數求補碼
2. 然後對補碼取反,包括符號位
3. 最後進行一個補碼求原碼的過程,一定要搞清概念啊。
-------------------------------------------------------------------------------------------------
下面我們再反推計算 (~ -10)
-10的原碼:1111 1010
-10的反碼:1111 0101 (符號位不變)
-10的補碼:1111 0110 (符號位不變,末位+1)
補碼取反:0000 1001 (符號位一起取反)
這是一個正數,那麼我們對其求原碼就可得到最終結果?
因為正數的補碼,反碼,原碼都是一樣的 那我們的最終結果是 0000 1001 ,十進位制是 9,這與我們前面推算出的結果吻合。
-------------------------------------------------------------------------------------------------
最後一個有趣的事實是:
1. 所有正整數的按位取反是其本身+1的負數
2. 所有負整數的按位取反是其本身+1的絕對值
3. 零的按位取反是 -1(0在數學界既不是正數也不是負數)
// 測試-1億 到 1億的所有整數 :)
for (int i = 0; i <= 100000000;++i)
{
if (~i != -(i+1) )
{
__asm { cli } // 彙編中斷指令
}
if (i && ~(-i) != abs((-i)+1) )
{
__asm { cli }
}
}
相關文章
- ~ 按位取反運算解析
- Java中按位取反運算子Java
- C# ~按位取反運算子C#
- 取反!和按位取反~的區別
- !和~的區別(邏輯取反和按位取反)
- java中與運算,或運算,異或運算,取反運算Java
- 計算機中的補碼與java取反運算計算機Java
- Java中的按位取反運算子,哪位能詳解一下?Java
- java 原碼、反碼、補碼計算 以及 取反(~)運算Java
- 位操作(取反)
- 位運算子的計算
- 計算機基礎:位運算計算機
- 對十進位制數字的按位輸出,取反,並求其位數
- 關於學習java中的按位取反(~)的問題Java
- opencv入門系列教學(六)影像上的算術運算(加法、融合、按位運算)OpenCV
- 二進位制、位運算、位移運算
- (位運算)兩個字串的位運算字串
- 位運算
- C# 位運算及例項計算C#
- JavaScript | 按位或運算子JavaScript
- JavaScript & 按位與運算子JavaScript
- JavaScript ~ 按位非運算子JavaScript
- 二進位制取反
- 理解位運算
- SQL位運算SQL
- 前端元件設計--位運算的妙用前端元件
- 使用位運算進行加法運算
- JavaScript ^ 按位異或運算子JavaScript
- 按位“或”賦值運算子 (|=)賦值
- 學習位運算
- PHP 位運算使用PHP
- 位運算進階
- 位運算總結
- 巧用JS位運算JS
- 位運算-異或(^)
- 程式設計中位運算用法總結程式設計
- js中 ~(按位非)運算子妙用JS
- java二進位制運算十進位制(精確運算)Java