Java二進制-補碼,左移,右移,無符號右移

一、二進制

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

參考鏈接:https://www.cnblogs.com/blog-cq/p/5793529.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章