|
|
package class010;
|
|
|
|
|
|
public class Code03_EvenTimesOddTimes {
|
|
|
|
|
|
// arr中,只有一种数,出现奇数次
|
|
|
public static void printOddTimesNum1(int[] arr) {
|
|
|
int eor = 0;
|
|
|
for (int i = 0; i < arr.length; i++) {
|
|
|
eor ^= arr[i];
|
|
|
}
|
|
|
System.out.println(eor);
|
|
|
}
|
|
|
|
|
|
// 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
|
|
|
// 0110010000
|
|
|
// 0000010000
|
|
|
int rightOne = eor & (~eor + 1); // 提取出最右的1
|
|
|
int onlyOne = 0; // e'
|
|
|
for (int i = 0 ; i < arr.length;i++) {
|
|
|
// arr[1] = 111100011110000
|
|
|
// rightOne= 000000000010000
|
|
|
if ((arr[i] & rightOne) != 0) {
|
|
|
onlyOne ^= arr[i];
|
|
|
}
|
|
|
}
|
|
|
System.out.println(onlyOne + " " + (eor ^ onlyOne));
|
|
|
}
|
|
|
|
|
|
|
|
|
public static int bit1counts(int N) {
|
|
|
int count = 0;
|
|
|
while(N != 0) {
|
|
|
int rightOne = N & ((~N) + 1);
|
|
|
count++;
|
|
|
N -= rightOne;
|
|
|
}
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
|
|
|
public static int add(int a, int b) {
|
|
|
int t = 0;
|
|
|
while( b != 0) {
|
|
|
t = a;
|
|
|
a = a ^ b;
|
|
|
b = ((t & b) << 1);
|
|
|
}
|
|
|
return a;
|
|
|
}
|
|
|
|
|
|
public static int minus(int a, int b) {
|
|
|
// -b ~b + 1
|
|
|
return add(a, add(~b , 1));
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
int a = 5;
|
|
|
int b = 7;
|
|
|
|
|
|
|
|
|
System.out.println(minus(a,b));
|
|
|
|
|
|
a = a ^ b;
|
|
|
b = a ^ b;
|
|
|
a = a ^ b;
|
|
|
|
|
|
System.out.println(a);
|
|
|
System.out.println(b);
|
|
|
|
|
|
int[] arr1 = { 3, 3, 2, 3, 1, 1, 1, 3, 1, 1, 1 };
|
|
|
printOddTimesNum1(arr1);
|
|
|
|
|
|
int[] arr2 = { 4, 3, 4, 2, 2, 2, 4, 1, 1, 1, 3, 3, 1, 1, 1, 4, 2, 2 };
|
|
|
printOddTimesNum2(arr2);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|