java基礎之位運算符

java提供的位運算符有:
第一部分:  &(位與),|(位或),^(位異或),~(位非) 
第二部分:  >>(右移),>>>(無符號右移),<<(左移)
其中除~爲一元操作符,其他的都是二元操作符。 
 根據運算模式不同分爲兩部分
一.第一部分
&,|,^,~ 的運算規則
* &:有0則0
* |:有1則1
* ^:相同則0,不同則1
* ~:按位取反
案例:
  1. class Demo1_Operator {
  2. public static void main(String[] args) {
  3. /*
  4. * &,|,^,~ 的用法
  5. * &:有0則0
  6. * |:有1則1
  7. * ^:相同則0,不同則1
  8. * ~:按位取反
  9. */
  10. System.out.println(6 & 3); //2
  11. System.out.println(6 | 3); //7
  12. System.out.println(6 ^ 3); //5
  13. System.out.println(~6); //-7
  14. }
  15. }

上述代碼是如何運算過程是什麼?
a.  6 & 3 的二進制位運算過程:有0則0
   110
& 011
-----------
    010

b.  6 | 3 的二進制位運算過程:有1則1
       110
   |    011
-------------
       111
c.  6 ^ 3 的二進制位運算過程:相同則0,不同則1
      110
^     011
-------------
      101

d.  6 ^ 3 的二進制位運算過程:按位取反
  00000000 00000000 00000000 00000110    //6的原碼反碼補碼都是本身
  11111111 11111111 11111111 11111001    // 對6取反得補碼
- 00000000 00000000 00000000 00000001    //減1求反碼
-----------------------------------------------------------
11111111 11111111 11111111 11111000      //反碼,對反碼進行除符號位以外其他位上按位取反。
10000000 00000000 00000000 00000111      //求得原碼(-7)

位運算之面試題
核心要點:^的特點:一個數據對另一個數據位異或兩次,該數本身不變。
題目:請自己實現兩個整數變量的交換(不需要定義第三方變量)
案例:
  1. class Demo2_Operator {
  2. public static void main(String[] args) {
  3. /*
  4. * 位異或運算符的特點
  5. * ^的特點:一個數據對另一個數據位異或兩次,該數本身不變。
  6. */
  7. int x = 10;
  8. int y = 5;
  9. //需要第三方變量
  10. /*
  11. int temp;
  12. temp = x; //temp = 10
  13. x = y; //x = 5
  14. y = temp; //y = 10
  15. */
  16. //不需要定義第三方變量,有弊端,有可能會超出int的取值範圍
  17. /*
  18. x = x + y; //10 + 5 = 15
  19. y = x - y; //15 - 5 = 10
  20. x = x - y; //15 - 10 = 5
  21. */
  22. //不需要第三方變量,通過^來做
  23. x = x ^ y; // 10 ^ 5 
  24. y = x ^ y; // 10 ^ 5 ^ 5 y = 10
  25. x = x ^ y; // 10 ^ 5 ^ 10  x = 5
  26. System.out.println("x = " + x + ",y = " +y);
  27. }
  28. }


二.第二部分
 >>,>>>,<<的基本運算規則:     a  位移運算符   b  (a表示要進行位移的數,b表示位移的位數)   
1.  <<:左移 左邊最高位丟棄,右邊補齊0
2.  >>:右移 最高位是0,左邊補齊0;最高位是1,左邊補齊1
3.  >>>:無符號右移 無論最高位是0還是1,左邊補齊0(正數適合,負數不適合,負數右移會變成正數)
4.  最有效率的算出2 * 8的結果
案例:
  1. class Demo3_Operator {
  2. public static void main(String[] args) {
  3. /*
  4. *  <<:左移 左邊最高位丟棄,右邊補齊0
  5. *  >>:右移 最高位是0,左邊補齊0;最高爲是1,左邊補齊1
  6. *  >>>:無符號右移 無論最高位是0還是1,左邊補齊0
  7. *  最有效率的算出2 * 8的結果
  8. */
  9. //左移,向左移動幾位就是乘以2的幾次冪
  10. //System.out.println(12 << 1); //24
  11. //System.out.println(12 << 2); //48
  12. /*
  13. 00000000 00000000 00000000 00001100 12的補碼
  14. (0)0000000 00000000 00000000 000011000 24的補碼
  15. (00)000000 00000000 00000000 0000110000 48的補碼
  16. */
  17. //System.out.println(-12 << 1); //-24
  18. //System.out.println(-12 << 2); //-48
  19. /*
  20. 10000000 00000000 00000000 00001100 -12的原碼
  21. 11111111 11111111 11111111 11110011 -12的反碼
  22. 11111111 11111111 11111111 11110100 -12的補碼
  23.         (1)11111111 11111111 11111111 11101000 -24的補碼
  24. 11111111 11111111 11111111 11100111 -24的反碼
  25. 10000000 00000000 00000000 00011000 -24的原碼
  26. */
  27. //右移,向右移動幾位就是除以2的幾次冪
  28. //System.out.println(12 >> 1); //結果爲 6
  29.             //System.out.println(-12 >> 1); //結果爲 -6
  30. /*
  31. 00000000 00000000 00000000 00001100 12的補碼
  32. 00000000 00000000 00000000 00000110 6的補碼
  33.                
  34. 10000000 00000000 00000000 00001100 -12的原碼
  35. 11111111 11111111 11111111 11110011 -12的反碼
  36. 11111111 11111111 11111111 11110100 -12的補碼
  37.         11111111 11111111 11111111 11111010(0) -6的補碼
  38. 11111111 11111111 11111111 11111001 -6的反碼
  39. 10000000 00000000 00000000 00000110 -6的原碼
  40. */
  41.                
  42.             //System.out.println(12 >>> 1); //運算規則與>>一樣 結果爲6,在這裏不做位運算詳解了
  43.             //System.out.println(-12 >>> 1); // 右移,最高位補0 結果2147483644
  44. /*
  45.  
  46. 10000000 00000000 00000000 00001100 -12的原碼
  47. 11111111 11111111 11111111 11110011 -12的反碼
  48. 11111111 11111111 11111111 11110100 -12的補碼
  49. 01111111 11111111 11111111 11111010(0) 2147483644的補碼
  50.                       01111111 11111111 11111111 11111010 2147483644的原碼
  51.             */
  52. //最有效率的算出2 * 8的結果 ,位運算的效率是比運算符的效率要高的.
  53. System.out.println(2 << 3);
  54. }
  55. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章