文章目錄
一、二進制
- 二進制的最高位是符號位(整數是0,負數是1)
- Java中沒有無符號數
- 計算機以整數的補碼進行計算
原碼:將一個整數轉換爲二進制
以int類型爲例,int類型在Java中是4個字節,32位
例如:
2 的原碼:00000000 00000000 00000000 00000010
-2的原碼:10000000 00000000 00000000 00000010
反碼
正數的反碼:與原碼相同
負數的反碼:符號位不變,其它位取反
例如:
-2的反碼:11111111 11111111 11111111 11111101
補碼
正數的補碼:與原碼相同
負數的補碼:反碼+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 (符號爲不變,其他位取反)
三、移位
左移<<
- 左移的規則只記住一點:丟棄高位,低位空位補0
- 移動的位數超過了該類型的最大位數編譯器會對移動的位數取模。比如int類型移動33位,實際移動1位
- 左移n位就相當於乘以2的n次方
例如
3 <<2(3爲int型)
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 1100
右移>>
- 符號位不變,左邊補上符號位
- 右移一位相當於除2,右移n位相當於除以2的n次方
例如
11 >>2(11爲int型)
0000 0000 0000 0000 0000 0000 0000 1011
0000 0000 0000 0000 0000 0000 0000 0010
無符號右移>>>
value >>> num
num 指定要移位值value 移動的位數。
無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位
總結
- 正數的原碼、反碼、補碼都一樣;
- 負數的反碼 = 原碼的符號位不變,其他位取反;
- 負數的補碼 = 反碼+1;
- 0的原碼、反碼、補碼都是0;
- 計算機以補碼進行運算;
- 取反不同於反碼;