Java中左移和右移問題圖文詳解

 1 原碼、反碼、補碼

原碼:將十進制轉化為二進制即原碼;
反碼:正數的反碼與原碼相同,負數的反碼(除卻最高位的符號位不變)與原碼相反;
補碼:正數的補碼與原碼相同,負數的補碼(除卻最高位的符號位不變)與原碼的取反加一。
舉例:5 和 -5
5:
原碼:0 0000000 00000000 00000000 00000101
反碼:0 0000000 00000000 00000000 00000101
補碼:0 0000000 00000000 00000000 00000101
-5:
原碼:1 00000000 00000000 00000000 00000101
反碼:1 1111111 11111111 11111111 11111010
補碼:1 1111111 11111111 11111111 11111011

2 位移操作

我們需要知道將一個數字,在計算機中進行移動多少位,例如8<<1代表將8轉化為二進制在計算機中左移1位,低位補零;
<<:左移:低位補0
>>:有符號右移:正數高位補0,負數高位補1
>>>:無符號右移,高位補零
為什麼沒有無符號左移呢?因為左移的情況下隻存在補零的情況。
舉例 :5 和 -5
5<<1
原碼:0 0000000 00000000 00000000 00000101
左移1位:0 0000000 00000000 00000000 00001010
即:10
-5<<1
原碼:1 00000000 00000000 00000000 00000101
補碼:1 1111111 11111111 11111111 11111011
左移1位:1 1111111 11111111 11111111 11110110
取其補碼:1 0000000 00000000 00000000 00001010
即:-10
5>>1
原碼:0 0000000 00000000 00000000 00000101
右移1位:0 0000000 00000000 00000000 00000010
即:2
-5>>1
原碼:1 00000000 00000000 00000000 00000101
補碼:1 1111111 11111111 11111111 11111011
右移1位:1 1111111 11111111 11111111 11111101
取其補碼:1 0000000 00000000 00000000 00000011
即:-3
5>>>1:與5>>1一樣,都是高位補0
原碼:0 0000000 00000000 00000000 00000101
右移1位:0 0000000 00000000 00000000 00000010
即:2
-5>>>1
原碼:1 00000000 00000000 00000000 00000101
補碼:1 1111111 11111111 11111111 11111011
右移1位:0 1111111 11111111 11111111 11111101
即:2147483645
代碼運行截圖

總結:

位移操作很簡單,使用補碼移動,補齊空缺位就行,除瞭>>:補與最高位一致的;其他移動哪缺哪補零。
在java中無論截圖中的a定義成 byte,short,int哪一種類型,它默認都是使用int類型(4字節32位),你使用long(8字節64位)

3 補充操作符

~(按位非):
逐位取反
|(按位或):
一真為真
1|0=1,
0|0=0,
1|1=1,
0|1=1
&(按位與):
兩真為真
1|0=0,
0|0=0,
1&1=1;
0&1=0
^(按位異或):
相異為真
1^1=0
1^0=1
0^1=1
0^0=0.

總結

到此這篇關於Java中左移和右移問題的文章就介紹到這瞭,更多相關Java左移和右移內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: