原碼
一個正數的原碼,是按照絕對值大小轉換成的二進制數。
一個負數的原碼,是按照絕對值大小轉換成的二進制數,然后最高位補1。
00000000 00000000 00000000 00000101 是5的原碼。
10000000 00000000 00000000 00000101 是-5的原碼。
反碼
正數的反碼與原碼相同。
負數的反碼為對該數的原碼除符號位外各位取反。
00000000 00000000 00000000 00000101 是5的反碼。
11111111 11111111 11111111 11111010 是-5的反碼。
補碼
正數的補碼與原碼相同。
負數的補碼為對該數的原碼除符號位外各位取反,然后在最后一位加1.
比如:10000000 00000000 00000000 00000101 的反碼是:11111111 11111111 11111111 11111011。
總結
正數的反碼和補碼都與原碼相同。
負數的反碼為對該數的原碼除符號位外各位取反。
負數的補碼為對該數的原碼除符號位外各位取反,然后在最后一位加1。
與運算 &
具體規則為:兩個二進制對應位都為1時,結果為1,否則結果為都0。
int a = 5; // 0000 0000 0000 0000 0000 0000 0000 0101
int b = 3; // 0000 0000 0000 0000 0000 0000 0000 0011
a &= b; // 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(a);
或運算 |
具體規則為:兩個二進制對應位為0時該位為0,否則為1。
int a = 5; // 000 0000 0000 0000 0000 0000 0000 0101
int b = 3; // 0000 0000 0000 0000 0000 0000 0000 0011
a |= b; // 0000 0000 0000 0000 0000 0000 0000 0111
System.out.println(a);
異或運算 ^
具體規則為:兩個二進制對應位相同時,結果為0,否則結果為1。
int a = 5; // 000 0000 0000 0000 0000 0000 0000 0101
int b = 3; // 0000 0000 0000 0000 0000 0000 0000 0011
a ^= b; // 0000 0000 0000 0000 0000 0000 0000 0110
System.out.println(a);
非運算 ~
具體規則為:操作數的第n位為1,那么結果的第n位為0,反之亦然。
int a = 5; // 000 0000 0000 0000 0000 0000 0000 0101
int b = ~a; // 1111 1111 1111 1111 1111 1111 1111 1010
System.out.println(b);
左移 <<
具體規則:左移,低位補0。
public class Test {
public static void main(String[] args) {
System.out.println(5<<2);
}
}
前: 0000 0000 0000 0000 0000 0000 0000 0101
后:0000 0000 0000 0000 0000 0000 0001 0100
右移 >>
具體規則:右移,高位補0。
public class Test {
public static void main(String[] args) {
System.out.println(5>>2);
}
}
前:0000 0000 0000 0000 0000 0000 0000 0101
后:0000 0000 0000 0000 0000 0000 0000 0001
無符號右移 >>>
-5換算成二進制:1111 1111 1111 1111 1111 1111 1111 1011
-5右移3位后結果為-1:1111 1111 1111 1111 1111 1111 1111 1111 // (用1進行補位)
-5無符號右移3位后的結果:0001 1111 1111 1111 1111 1111 1111 1111 // (用0進行補位)
無符號左移 <<<
正數或者負數左移(無符號左移),低位都是用0補。