java按位取反“~“运算符,负数右移
首先回顧下計算機組成原理的知識:java中數字以補碼存儲(補碼存儲原因(1)),
????????? 正數的原碼,反碼,補碼相同,
????????? 負數的反碼是在原碼基礎上符號位不變,其他位按位取反,負數補碼是在反碼基礎上加一
例子1:求~10(byte類型)
byte a = 10;
原碼,補碼,反碼:
00001010
按位取反后
11110101
再將補碼轉換成源碼,由于負數生成補碼的規則是:在反碼基礎上加1,因此需要按照此規則轉成原碼
先執行減一操作得到反碼:
11110100
除去首位的符號位外取反得:
10001011? (對應十進制-11)
例子2:求~-6(byte類型)
原碼:
10000110 ,
反碼:
11111001,(負數的反碼與原碼符號位相同,數值為取反)
補碼:
11111010,
按位取反后:
00000101,(得到是正數,原碼就是這個,對應十進制5)
負數右移:
1:有符號右移(>>):左邊空位填充1
-4:
補碼:? ? ? ? ? ? ? ? ? 11111111111111111111111111111100
有符號左移一位: 11111111111111111111111111111110
再減1? ? ? ? ? ? ? ? ? ? 11111111111111111111111111111101
非符號位取反:? ?10000000000000000000000000000010 (十進制是-2)
同樣對-4對無符號右移一位(左邊空出來的補0):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 01111111111111111111111111111110
此時得到的是正數,因此直接轉換成10進制就是2147483646
?
(1):為了簡化電路設計,計算機中有加法無減法,我們拿3-2(byte類型,8位)做例子,3-2等于3 + (-2),補碼分別為:
00000011? ?11111110
補碼相加等于00000001, 對應十進制為1。
總結
以上是生活随笔為你收集整理的java按位取反“~“运算符,负数右移的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java poi excel无法添加水印
- 下一篇: mysql limit耗时过长