按位取反運算符~


二進制數在內存中以補碼的形式存儲。

按位取反:二進制每一位取反,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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM