位运算 - oneslideicywater/algor GitHub Wiki
我们换一个角度来看,如果数组中没有x,那么数组中所有的数字都出现了3次,在二进制上,每位上1的个数肯定也能被3整除。
public class Main {
public static void main(String[] args) {
int a[] = {5,2,3,3,2 };
for (int j = 0; j < a.length; j++) {
System.out.print(a[j]);
}
System.out.println();
System.out.println(findNumber(a, a.length));
}
public static int findNumber(int a[], int n) {
int bits[] = new int[32];
Arrays.fill(bits, 0);
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 32; j++)
bits[j] += ((a[i] >> j) & 1);
// 如果某位上的结果不能被整除,则肯定目标数字在这一位上为
int result = 0;
for (j = 0; j < 32; j++)
if (bits[j] % 2 != 0)
result += (1 << j);
return result;
}
}
两个相同的数,异或为0.异或可以过滤掉偶数次出现的数。
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
scanner.nextLine();
int[] a=new int[n];
for (int i = 0; i <n ; i++) {
a[i]=scanner.nextInt();
}
System.out.println(groupXor(a));
}
public static int xor(int a,int b){
return a^b;
}
public static int groupXor(int[] a){
int result=a[0];
for (int i = 0; i < a.length-1; i++) {
result=result ^ a[i+1];
}
return result;
}
}
public static int[] transformToBits(int oper){
int[] bits=new int[32];
for (int i = 0; i <32 ; i++) {
bits[i]=(oper>>i)&1;
}
return bits;
}
public static int transformBitsToInt(int[] oper){
int sum=0;
for (int i = 0; i < 31; i++) {
sum+=oper[i]<<i;
}
return sum;
}
如何判断一个数是不是2的幂? 转化为二进制数后,只有一个位是1。 如何判断一个数是不是2^n的幂? 在满足是2的幂的条件下,32bit分成自组,如果有个位在小组第3位就是4的幂。