位運算符計算(轉載)

今天看代碼遇到位運算符,由於不經常使用已經忘記了,因此複習一下。Java位運算符包括:位與'&',位或'|',位非'~',位異或'^',右移'>>',左移'<<',右移'>>>' 。java

位運算是以二進制位爲單位進行的運算,其操做數和運算結果都是整型值。運算須要用到一些二進制知識,稍微回顧一下。這裏有一篇介紹二進制、原碼、反碼和補碼的文章:https://blog.csdn.net/vickyway/article/details/48788769。比較詳細,這裏再也不贅述了。.net

下面代碼中有具體計算過程(稍需注意的是,Java中int類型是32bit)對象

//java中包含運算符 = 位與'&',位或'|',位非'~',位異或'^',右移'>>',左移'<<',右移'>>>'
//參與位運算的數字都是二進制補碼的方式進行按位與、或、異或,正數的反碼、補碼都是其自己

//1. '&' 位與運算符(兩個操做數都爲1,結果才爲1,不然結果爲0)
System.out.print("1&-3 = ");
System.out.println(1&-3);
/*計算過程(使用補碼)
1: 00000000 00000000 00000000 00000001
-3: 11111111 11111111 11111111 11111101
結果: 00000000 00000000 00000000 00000001 (結果也是補碼,由於是正數,原碼相同) 1
*/

//2. '|' 位或運算符(兩個位只要有一個爲1,那麼結果就是1,不然就爲0)
System.out.print("1|-3 = ");
System.out.println(1|-3);
/*計算過程(使用補碼)
1: 00000000 00000000 00000000 00000001
-3: 11111111 11111111 11111111 11111101
結果: 11111111 11111111 11111111 11111101 (結果也是補碼,轉成原碼 10000000 00000000 00000000 00000011) -3
*/

//3. '~' 位非運算符(若是位爲0,結果是1,若是位爲1,結果是0)
System.out.print("~-3 = ");
System.out.println(~-3);
/*計算過程(使用補碼)
-3: 11111111 11111111 11111111 11111101
結果: 00000000 00000000 00000000 00000010 (正數,原碼相同) 2
*/

//4. '^' 位異或運算符(兩個操做數,相同則結果爲0,不一樣則結果爲1)
System.out.print("1^-3 = ");
System.out.println(1^-3);
/*計算過程(使用補碼)
1: 00000000 00000000 00000000 00000001
-3: 11111111 11111111 11111111 11111101
結果: 11111111 11111111 11111111 11111100 (轉成原碼:10000000 00000000 00000000 0000 0100) -4
*/

//5. '<<' 左移運算符(左移運算符,將運算符左邊的對象向左移動運算符右邊指定的位數(在低位補0))
System.out.print("-3<<2 = ");
System.out.println(-3<<2);
/*計算過程(使用補碼)
-3: 11111111 11111111 11111111 11111101
結果: 11111111 11111111 11111111 11110100 (轉成原碼:10000000 00000000 00000000 00001100) -12
*/

//6. '>>' 右移運算符("有符號"右移運算 符,將運算符左邊的對象向右移動運算符右邊指定的位數。若是值爲正,則在高位補0,若是值爲負,則在高位補1.)
System.out.print("-3>>2 = ");
System.out.println(-3>>2);
/*計算過程(使用補碼)
-3: 11111111 11111111 11111111 11111101
結果: 11111111 11111111 11111111 11111111 (轉成原碼:10000000 00000000 00000000 00000001) -1
*/

//7. '>>>' 右移運算符("無符號"右移運算 符,將運算符左邊的對象向右移動運算符右邊指定的位數。不管值的正負,都在高位補0.)
System.out.print("-3>>>2 = ");
System.out.println(-3>>>2);
/*計算過程(使用補碼)
-3: 11111111 11111111 11111111 11111101
結果: 00111111 11111111 11111111 11111111 2^30次方 - 1 = 1073741823

blog

相關文章
相關標籤/搜索