一、二進制(原碼、反碼、補碼)
- 二進制的最高位是符號位(“0”代表正數,“1”代表負數);
- Java中沒有無符號數;
- 計算機以整數的補碼進行運算;
1. 原碼:將一個整數轉換成二進制表示
以 int 類型為例,int類型占4個字節、共32位。
例如,2 的原碼為:00000000 00000000 00000000 00000010
-2的原碼為:10000000 00000000 00000000 00000010
2. 反碼
正數的反碼:與原碼相同
負數的反碼:原碼的符號位不變,其他位取反
例如,-2 的反碼為:11111111 11111111 11111111 11111101
3. 補碼
正數的補碼:與原碼相同
負數的補碼:反碼+1
例如,-2 的補碼為:01111111 11111111 11111111 11111110
二、位運算
Java中有4個位運算符:
1. 按位與 &:兩位都為1,結果為1
例如,2&3 = 2
2 的原碼為: 00000000 00000000 00000000 00000010
3 的原碼為: 00000000 00000000 00000000 00000011
2&3 原碼為: 00000000 00000000 00000000 00000010 = 2
2. 按位或 |:至少一位為1,結果為1
例如,2|3 = 3
2 的原碼為: 00000000 00000000 00000000 00000010
3 的原碼為: 00000000 00000000 00000000 00000011
2|3 原碼為: 00000000 00000000 00000000 00000011 = 3
3. 按位異或 ^:兩位一個為1、一個為0,結果為1
例如,2|3 = 3
2 的原碼為: 00000000 00000000 00000000 00000010
3 的原碼為: 00000000 00000000 00000000 00000011
2^3 原碼為: 00000000 00000000 00000000 00000001 = 1
4. 按位取反 ~:0變成1、1變成0
例如,~2 = -3
對2的原碼取反:11111111 11111111 11111111 11111101 (取反后結果的補碼,也就是-3的補碼。我們需要從補碼推出原碼,才能得到-3)
轉換成反碼: 11111111 11111111 11111111 11111100 (補碼減1)
轉換成原碼: 10000000 00000000 00000000 00000011 =-3 (符號為不變,其他位取反)
總結
- 正數的原碼、反碼、補碼都一樣;
- 負數的反碼 = 原碼的符號位不變,其他位取反;
- 負數的補碼 = 反碼+1;
- 0的原碼、反碼、補碼都是0;
- 計算機以補碼進行運算;
- 取反不同於反碼;
2018-01-06 18:38:29