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