Java按位取反運算符“~”的工作原理


說明:本文參考了文章《Java按位取反運算符“~”》,鏈接:https://blog.csdn.net/smilecall/article/details/4245447


 補充:位運算符(~、&、|、^,<<、>>)都是在補碼(計算機存儲的形式)上操作。(原答案如下)


 1.二進制數在內存中是以補碼的形式存放的;補碼首位是符號位,0表示此數為正數,1表示此數為負數

如:
正數9——>具有符號位的二進制原碼01001(首位表示符號位)——>補碼01001((第2條會講補碼怎么來的)——>在內存中的形式0***1001(*表示無效位,其數量取決於分配的內存空間

負數-1——>具有符號位的二進制原碼11(首位表示符號位)——>補碼11(第2條)——>在內存中的形式1***1(*表示無效位)

2. 正數、負數的補碼是什么?

①正數的補碼、反碼都是其二進制本身,只是需要在首位填加0,作為符號位。

如:

正數9——>二進制01001(首位表示符號位的二進制形式)——>補碼01001(不變)

②負數的反碼:符號位1不變,后面有效位數全部取反(有效位是指該數的無符號二進制位,如9的有效位指1001,-1的有效位指1);

 負數的補碼:其反碼再加1得到,即原碼通過符號位不變,且有效位按位取反再加1也可得到;

如:

負數-1——>二進制原碼11——>反碼10(符號位1不變,后面有效位數全部取反)

負數-1——>二進制原碼11——>補碼11【反碼的有效位加1(此處不考慮符號)或者是原碼符號位不變,有效位按位取反再加1】
3. 計算機輸出內存數據方式
將內存中的補碼轉換成原碼,進行顯示;
例如:
正數9——>內存中補碼0***1001——>轉換成原碼0***1001(不變)——>輸出+9
負數-5——>內存中補碼1***011——>轉換成原碼1***101(補碼中符號位后面的有效位減1,再取反,即負數補碼的逆過程)——>-5
4. 按位取反運算符“~”的原理
按位取反運算符是將內存中的補碼按位取反(包括符號位)
例如:
9(在內存中以補碼0***1001存放)——>按位取反操作“~”——>變成補碼1***0110(這明顯變成了一個負數補碼,因為符號位是1)——>輸出時:補碼減1,再取反得到原碼1***1010——>輸出-10
-1(在內存中以補碼1***1存放)——>按位取反操作“~”——>變成補碼0***0(這明顯是正數補碼,因為符號位是0)——>輸出時:得到原碼0***0——>輸出0

注:所有的取反操作、加1、減1操作,都在有效位進行;***代表的無效位,分析時不要管。

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

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



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