与运算&
一个数&上自己的取反+1就能将最右边的1提取
a | b | &结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
(异或运算--无进位相加)
注:a和b不可以指向内存同一块区域
public static void swap(int[] arr,int i,int j){
arr[i]=arr[i]^arr[j];
arr[j]=arr[i]^arr[j];
arr[i]=arr[i]^arr[j];
}
a | b | ^结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
(相同为0,不同为1)
0^N=N ,N^N=0 (异或运算满足交换律和结合律)
也可利用异或寻找数组中奇数次的数
例:在arr数组中,仅有a和b出现奇数次,并且a和b中从右开始计算第x位分别为0和1,请找出a和b的值