/*

   位运算  二进制  补码


      基本的 &(与)  |(或)  ^(异或)  ~(按位取反)


 连接的是数值(除了布尔类型的)

      

 一般我们做案例,用的数据都是采用整数 (int)


*/

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);
}
}

/*

  模拟底层运算:

        二进制 的补码

   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);
}
}