位运算
&,|, ^ ,~,<<,>>,>>>
这四种运算都是基于位的。
&:每一位都比较,有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);