JAVA位運算

/*java

   位運算  二進制  補碼面試


      基本的 &(與)  |(或)  ^(異或)  ~(按位取反)ide


 鏈接的是數值(除了布爾類型的)spa

      

 通常咱們作案例,用的數據都是採用整數 (int)開發


*/it

class OperatorDemo{
public static void main(String[] args) {
int a = 3;
int b = 4;
//位與&
System.out.println(a&b);//0
        //位或
        System.out.println(a|b);//7
//位異或
        System.out.println(a^b);//7
//按位取反
       System.out.println(~3);
}
}

/*class

  模擬底層運算:效率

        二進制 的補碼變量

   int  a   4個字節  32    3二進制

   原碼     00000000 00000000 00000000 00000011



   int  b   4個字節  32     4

   原碼     00000000 00000000 00000000 00000100


   位與運算 :有0則0  

            00000000 00000000 00000000 00000011

 &     00000000 00000000 00000000 00000100

 ------------------------------------------

       00000000 00000000 00000000 00000000


        結果   0 


   位或運算: 有1則1

            00000000 00000000 00000000 00000011

 |     00000000 00000000 00000000 00000100

 ------------------------------------------

            00000000 00000000 00000000 00000111

結果是 7


     位異或運算:相同爲0 不一樣爲1 

            00000000 00000000 00000000 00000011

 ^     00000000 00000000 00000000 00000100

 ------------------------------------------

            00000000 00000000 00000000 00000111


結果是7

 


 按位取反 ~ 每一位  0變1  1變0

      00000000 00000000 00000000 00000011  

        ~

-----------------------------------------

           11111111 11111111 11111111 11111100    補碼


           11111111 11111111 11111111 11111011    反碼

  10000000 00000000 00000000 00000100    原碼

           (-4)


*/


/*

  位異或特色:

     ^   

     一個數 與另外一個數 位異或兩次 獲得結果是其值自己

*/

class OperatorDemo2{
public static void main(String[] args) {
int a = 3;
int b = 4;
System.out.println(a^b^a);//4  難道獲得的結果是b嗎
        System.out.println(a^b^b);//若是我獲得的結果是3  說明一個結論:結果是a
}
}


/*

   位運算  二進制  補碼

  A:案例演示

<<:左移 這個數的二進制 進行 左移 空位補0,被移除的高位丟棄。

>>:右移 被移位的二進制最高位是0,右移後,空缺位補0;最高位是1,高位補1。

>>>:無符號右移 被移位二進制最高位不管是0或者是1,空缺位都用0補。

B:結論:

<< : 把<<左邊的數據乘以2的移動次冪

>> : 把>>左邊的數據除以2的移動次冪

面試題:

    請用最有效率的方式計算出2*8的結果?

          作位運算最快了

  2*8 = 2*2^3

        2<<3


 64/8 

 =64/2^3 = 64>>3

                   

*/

class OperatorDemo3{
public static void main(String[] args) {
//左邊數據乘以2的移動次方
System.out.println(3<<2);//3*2^2 = 12
//System.out.println(3<<3);//3*2^3 = 24
//>> 右移
//左邊數據除以2的移動次方
System.out.println(24>>3);//24/2^3 = 3
        
System.out.println(24>>>3);
        System.out.println("-------------------------");
//若是是負數呢?
System.out.println(-24>>3);//-3
        
System.out.println(-24>>>3);//??
}
}

/*

  模擬一下 計算機底層

   3  int  4 

          00000000 00000000 00000000 00000011  原碼


          00000000 00000000 00000000 00000011

  <<  (00)000000 00000000 00000000 0000001100


          000000 00000000 00000000 0000001100 最後結果的補碼

         原碼補碼同樣

    12 



   System.out.println(-24>>3);//-3

        右移: >>

  -24  int  4  


  10000000 00000000 00000000 00011000  原碼

           11111111 11111111 11111111 11100111  反碼

  11111111 11111111 11111111 11101000  補碼


           11111111 11111111 11111111 11101000

>>         11111111111 11111111 11111111 11101(000)  

           補碼  11111111111 11111111 11111111 11101

  反碼  11111111111 11111111 11111111 11100

  原碼  10000000000 00000000 00000000 00011

  (-3)


System.out.println(-24>>>3);//??


  10000000 00000000 00000000 00011000  原碼

           11111111 11111111 11111111 11100111  反碼

  11111111 11111111 11111111 11101000  補碼


           11111111 11111111 11111111 11101000

>>>        00011111111 11111111 11111111 11101(000)  補碼


      原碼 00011111111 11111111 11111111 11101



*/


/*

  己實現兩個整數變量的交換


     1:想法 找個中間量

   利用中間變量 

*/

class OperatorTest{
public static void main(String[] args) {
int a = 20;
int b = 40;
        //經過中間變量來實現  開發中就這麼用  這是今天必需要掌握的內容
       /*  
   //必須掌握的
int temp = a;
        a=b;
        b=temp;
        
//經過異或 
        //左邊 a,b,a  右邊 a^b  
//要把結論記住的
a = a^b;//  a:20^40  b:40
b = a^b;//  20^40^40 = 20   b:20  a:20^40 
a = a^b;//  20^40^20 =40    a:40 b:20
*/
        //瞭解的 最好理解
//a = a+b;// a :60 b:40
        //b = a-b;// 60-40 = 20  b:20
//a = a-b;// 60-20 = 40  a:40
        
//還有一種 一句話 ,面試以前背一下
b = (a+b)-(a=b);//a:40
//   60 -  40 =20
System.out.println("a:"+a);
System.out.println("b:"+b);
System.out.println(0.09 + 0.01);
}
}
相關文章
相關標籤/搜索