02. 位运算的巧妙
两个数异或,相同为0,不同为1.
7 0111
13 1101
两个数异或 等于 1010
有一种简便算法,异或运算又可以叫做无进位相加
二进制相加,不进为,即在同一位置上时,有偶数个1,结果就为0,有奇数个1,结果就为1 ,合并起来,就是异或的结果。
性质: 0^n = n n^n = 0 记无进位相加就好了。
1.不新增变量的情况下交换两个数的值
新增变量的方法
int tmp = a ;
a = b;
b = tmp ;
不用新增变量
int a = 105 ;
int b = 85 ;
a = a ^ b ;
b = a ^ b ; // b = a^b^b=a^0=a
a = a ^ b ; // a = a^b^a=0^b=b
// 这样就把两个数交换了。
// 需要注意的是,如果 a,b指向通一个位置,这样写是会报错的。
// 自己新手解读那不要用,知道就可以了。
2. 数组中,只有一种数出现了奇数次,其他都出现了偶数次找到他。
public static void printOddTimesNum1(int[] arr){
int ero = 0 ;
for(int i = 0; i < arr.length; i ++){
ero ^= arr[i] ;
}
System.out.println(ero);
}
//看下面的举例,for循环累计异或,偶数个相同的数异或为0,只有最后那个奇数个的数异或最后的值为它,所以可以这样用这个值来解
3. 怎么把一个int类型的数,提取出最右侧的1来
二进制中的最右侧的1.
// 看图可以得知,将a取反加1 ,即可取出最右侧的1
// a取反加1 = -a
int a = 134 ;
int res = a & (-a) ;
res // 为最右侧的一 ;