[轉]java位操作符總結
二進位制負數以它正值的補碼形式表達
補碼:反碼+1等於補碼
比如:System.out.println(Integer.toBinaryString(-5));
列印:1111 1111 1111 1111 1111 1111 1111 1011 不用想了肯定是32位
過程是這樣的:
一個負數,比如-5,它的二進位制在java裡面是這樣表示
1000 0000 0000 0000 0000 0000 0000 0101 (負值是開頭1)
它的正值是:
0000 0000 0000 0000 0000 0000 0000 0101 (正值開頭是0)
反碼是:
1111 1111 1111 1111 1111 1111 1111 1010 (這裡是正值的反碼)
再加上1是:
1111 1111 1111 1111 1111 1111 1111 1011
即得到列印的內容
java ~ 操作符,對每個二進位制位的內容求反,即1變成0,0變成1
測試負數:
int a = -5;//101;
System.out.println(~a);
列印:4
過程是這樣的,首先表示出來這個負數
1111 1111 1111 1111 1111 1111 1111 1011(上面已經提到為什麼這樣表示)
各位取反得到
0000 0000 0000 0000 0000 0000 0000 0100
轉為10進製得到4
測試正數:
int a = 5;//101;
System.out.println(~a);
列印:-6
首先表示出來這個正數:
0000 0000 0000 0000 0000 0000 0000 0101
各位取反得到:
1111 1111 1111 1111 1111 1111 1111 1010
java & 操作符,對應的二進位制位進行與操作,兩個都為1才為1,其他情況均為0
測試:
System.out.println(5&6);
列印:4
過程:
5表示成:0000 0000 0000 0000 0000 0000 0000 0101
6表示成:0000 0000 0000 0000 0000 0000 0000 0110
進行 & :0000 0000 0000 0000 0000 0000 0000 0100
得到:4
java | 操作符,對應的二進位制位進行或操作,兩個都為0才為0,其他情況均為1
測試:
System.out.println(5|6);
列印:7
過程:
5表示成:0000 0000 0000 0000 0000 0000 0000 0101
6表示成:0000 0000 0000 0000 0000 0000 0000 0110
進行 | :0000 0000 0000 0000 0000 0000 0000 0111
得到:7
java ^ 操作符 當對應二進位制位值相同,該位為0 否則為1
System.out.println(5^6);
列印:3
過程:
5表示成:0000 0000 0000 0000 0000 0000 0000 0101
6表示成:0000 0000 0000 0000 0000 0000 0000 0110
進行 ^ :0000 0000 0000 0000 0000 0000 0000 0011
得到:3
java << 操作符,左邊移動,右面填充0
測試:
System.out.println(5<<1);
列印:10
5表示成:0000 0000 0000 0000 0000 0000 0000 0101
進行 <<1 操作:0000 0000 0000 0000 0000 0000 0000 1010
java >> 操作符,右邊移動,左面填充0
測試:
System.out.println(5>>>1);(“有符號”右移位運算子使用了“符號擴充套件”:若值為正,則在高位插入0;若值為負,則在高位插入1。Java也添加了一種“無符號”右移位運算子(>>>),它使用了“零擴充套件”:無論正負,都在高位插入0。)
列印:2
5表示成:0000 0000 0000 0000 0000 0000 0000 0101
進行 >>>1 操作:0000 0000 0000 0000 0000 0000 0000 0010
左移動一位相當乘以2 右移動一位相當處以2
(http://www.blogjava.net/zhaomingchao/articles/298318.html)