位运算

&| ^ ~<<>>>>>

这四种运算都是基于位的。

&每一位都比较,有0则0,无0则1.

|: 每一位都比较,有1则1,无1则0.

^: 相同则0,不同则1

^异或运算有个特点,一个数据对另一个数据异或两次,该数据不变

例如5^10^10=5  (一个数与相同数据异或2次,该数据不变)

~每一位都取反

用6和3举例

           110

&         011

-----------

            010

           

            110

|          011

-----------

            111

            110

^          011

-----------      

            101

~ -----------

            int 四个字节

            00000000 00000000 00000000 00000110

            11111111 11111111 11111111 11111001   ~6

            10000000 00000000 00000000 00000111   -7

            求原码

<<:左移 左边最高位丢弃,右边补进0

0000 0001 -> 0000 0010

>>:右移 最高位是0,左边补齐0,最高位是1,左边补齐1

>>>:无符号右移:无论最高位是0还是1,左边都补齐0

System.out.println(12<<1);  //24

System.out.println(12<<2);  //48

00000000 00000000 00000000 00001100   12的补码

 (0)0000000    00000000 00000000 000011000   8+16=24

(00)000000 00000000 00000000 0000110000   16+32=48

System.out.println(12>>3); //1

00000000000 00000000 00000000 00001(100)  1=1   

System.out.println(-2>>1); //-1

10000000 00000000 00000000 00000010 原码

11111111 11111111 11111111 11111110      补码

111111111 11111111 11111111 1111111(0) 结果的补码

100000000 00000000 00000000 0000001  结果的原码=-1 

无符号右移

System.out.println(-2>>>1);//2147483647

11111111 11111111 11111111 11111110      补码

011111111 11111111 11111111 1111111(0)  结果的补码

写程序计算2的8次方

System.out.println(1<<8);

原文地址:https://www.cnblogs.com/wanghuaying/p/9293619.html