二進制數在內存中以補碼的形式存儲。
按位取反:二進制每一位取反,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
