直接用代码说明
int a = 3;
int b = 5;
a = a ^ b; //a = 3^5
b = a ^ b; //b = 3^5^5 => 3
a = a ^ b; //a = 3^5^3 => 5
//上面使用到的是位运算 ;
//一个元素 ^ 两次同一个元素 最后的结果还是 它本身;
//十进制 二进制
// 20 10100 0000 0000 0001 0100
// 12 01100 1111 1111 1110 1011
//位运算的一些介绍
// & 两个数据 相比 都是 true 才是true
System.out.println(20 & 12); //00100 4
// | 两个数据,同时都是false 才是false
System.out.println(20|12); //11100 28
// ^ 不同是true,相同是false
System.out.println(20^12); //11000 24
// ~ 取反,二进制全部取反,0变1,1变0,包括符号位
System.out.println(~10); //11111111111111111111111111110101 -11
//这里说一下 11111111111111111111111111110101 怎么换算成-11的,
// 负数的二进制码是 这个数的绝对值的数值的二进制码 进行 反码 补码 运算得到的,也就是上面这个样子.
//现在需要把 11111111111111111111111111110101 -1 变成 11111111111111111111111111110100
//11111111111111111111111111110100 进行反码 变成 0000000000000000000000000001011
// 也就是 11 在加上 原来的负号 就成了-11
// << 有符号左移运算,符号位保存,右边补0;
System.out.println(20<<1); //20 * 2的1次幂 = 40
// >> 有符号右移运算,符号位保存,左侧补0
System.out.println(20>>1); //20 / 2的1次幂 = 10
// >>> 无符号右移,无论左侧符号位是1还是0,都补上0;
System.out.println(20>>>1); //20 / 2的1次幂 = 10