韓順平 java 第二十講 二進制、位運算、移位運算符

計算機二進制中的原碼、補碼、反碼

計算機內部處理的信息都是採用二進制數來表示。進位規則是“逢二進一”
int a = 1;
int類型是4個字節,一個字節等於八個bit。所以一共32bit。


重點內容

  • 二進制的最高位是符號位,0代表正數,1代表負數
  • 正數的原碼補碼反碼都一樣
  • 負數的反碼=它的原碼符號位不變其他位取反
  • 負數的補碼=它的反碼+1
  • 0 的反碼、補碼都是0
  • java沒有無符號數,也就是說java中的數都是有符號的
  • 在計算機計算的時候,都是以補碼的方式來運算的

例子:模擬計算機計算1-2的過程

相當於:1+(-2)
1的補碼:0000……0001
-2的原碼:1000……0010
-2的反碼:1111……1101
-2的補碼:1111……1110
所以:1和-2的補碼相加:
得到:1111……1111
結果是補碼。結果如果是正數的話,原碼就是結果;但這個結果是負數,所以還要裝換成原碼:
結果的補碼:1111……1111
結果的反碼:1111……1110
結果的原碼:1000……0001
也就是-1!

位運算符和移位運算符

  • 這些操作都是準對補碼來說的,操作之前都要轉換成補碼
  • 4個位運算,分別是:按位與&、按位或|、按位異或^、按位取反~;這幾個運算都是針對補碼來運行的。
  • 3個移位運算:算數左移<<(低位溢出,符號位不變,並用符號位補溢出的高位);算數右移>>(符號位不變,低位補零);邏輯右移>>>(低位溢出,高位補零)

求下列輸出結果:

int a = 1>>2;
//結果:0
//1的補碼:0000……0001
//右移兩位:0000……0000(符號位爲0)
int b = -1>>2;
//結果:-1
//-1的原碼:1000……0001
//-1的反碼:1111……1110
//-1的補碼:1111……1111
//所以-1右移多少位都是-1
int c = 1<<2;
//結果:4
//相當於乘以二
int d = -1<<2;
//結果:-4
//-1的補碼:1111……1111
//左移2位:1111……1100
//結果的反碼:1111……1011
//結果的原碼:1000……0100
//也就是-4
int e = 3>>>2;
//結果:0
//3的補碼:0000……0011
//邏輯右移3位:0000……0000
int a = ~2
//結果是:-3;過程如下:
//2的補碼是:0000……0010
//取反之後是:1111……1101
//很明顯這個是負數的補碼,要轉換成原碼:
//結果的反碼是:1111……1100
//結果的原碼是:1000……0011
//也就是-3
int c = 2&3
//兩個都是正數
//2的補碼:0000……0010
//3的補碼:0000……0011
//&之後:  0000……0010
//這個也是結果的原碼,就是2
int d = 2|3
//這個同上個,結果是:3
int e = ~-5
//-5原碼:1000……0101
//-5反碼:1111……1010
//-5補碼:1111……1011
//取反:   0000……0100
//是正數,所以結果是:4
int f = -3^3
//-3 的原碼:1000……0011
//-3反碼:1111……1100
//-3補碼:1111……1101
//3補碼:0000……0011
//然後二者異或:1111……1110(補碼,負數:還需要轉換成原碼)
//結果的反碼:1111……1101
//結果的原碼:1000……0010
//也就是:-2
  • 如何用最快的方法判斷一個數是2的n次方?移位運算
  • 如果用最快的方法將一個數變成原來的二倍?移位運算
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章