1. 程式人生 > >Java:二進制(原碼、反碼、補碼)與位運算

Java:二進制(原碼、反碼、補碼)與位運算

無符號 位與 轉換成 轉換 不同 一個 位或 其他 log

一、二進制(原碼、反碼、補碼)

  • 二進制的最高位是符號位(“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. 正數的原碼、反碼、補碼都一樣;
  2. 負數的反碼 = 原碼的符號位不變,其他位取反;
  3. 負數的補碼 = 反碼+1;
  4. 0的原碼、反碼、補碼都是0;
  5. 計算機以補碼進行運算;
  6. 取反不同於反碼;

2018-01-06 18:38:29

Java:二進制(原碼、反碼、補碼)與位運算