關於學習java中的按位取反(~)的問題

daokai1993發表於2013-07-16

之前不知道按位取反到底是怎麼計算的

百度谷歌的半天    也沒有什麼具體的計算防暑    後來自己琢磨了一會兒 發現了一點按位取反的技巧  在此分享一下

負數的取反 就是在原碼的基礎上取反碼  然後在取補碼(補碼=反碼+1)當反碼的最後一位數已經為1的時候    補碼再+1後就應該向前進一位

例如十進位制數: -6    -6在java中的原碼為10000000 00000000 00000000 00000110   其反碼為11111111 11111111 11111111 11111001 

所以-6的補碼就是11111111 11111111 11111111 11111010   再將補碼取反就是~(-6)的二進位制數:00000000 00000000 00000000 00000101 轉換為10進位制就是5.

正數的原碼=補碼=反碼

正數的按位取反其實可以參照負數

其計算方式可以按負數的逆思路直接推出

比如說一個十進位制數:5

5的原碼、反碼、補碼全部都是00000000 00000000 00000000 00000101   

那麼先將5的二進位制數取反,並得到:11111111 11111111 11111111 11111010(把它看做是某個數的補碼)

然後再將得到某個數的補碼(姑且稱之為補碼吧)-1

就得到反碼:11111111 11111111 11111111 11111001(因為補碼最後一位數為0  所以往前一位“借數”,所以最後一位數為1)

最後將反碼譯為原碼:10000000 00000000 00000000 00000110   所以~(5)就為-6.



注:以上純屬本人在探索過程中的個人理解,如果錯誤,希望大神指出!謝謝!

相關文章