//求第一个位置的1
n&(~n+1)
//如何不用额外变量交换两个数
a= a^b
b= a^b = a^b^b
a= a^b = a^b ^ a^b^b
// arr中,有两种数,出现奇数次
public static void printOddTimesNum2(int[] arr) {
int eor = 0;
for (int i = 0; i < arr.length; i++) {
eor ^= arr[i];
}
// eor = a ^ b
// eor != 0 两个数不一样,eor必然有一个位置上是1
// 提取出最右的1 , 就可以把两个数分开, 这位是1或不是1
int rightOne = eor & (~eor + 1); //
int onlyOne = 0; // eor'
for (int i = 0 ; i < arr.length;i++) {
// 分两组, reghtOne
if ((arr[i] & rightOne) != 0) { //只有0或1,是否有1
onlyOne ^= arr[i];
}
}
System.out.println(onlyOne + " " + (eor ^ onlyOne));
}
//数1的个数
public static int bit1counts(int N) {
int count = 0;
// 011011010000
// 000000010000 1
// 011011000000
while(N != 0) {
int rightOne = N & ((~N) + 1);
count++;
N ^= rightOne;
// N -= rightOne
}
return count;
}
异或经典题目
于 2021-06-06 01:15:06 首次发布