今天听了一节课,有点叼啊,之前不明白的地方,今天一下子明白了
N^0=N
N^N=0
获取右侧为1的第一个位置:int a = N & ((~N) + 1);
取得一个数组中,有两组数出现奇数次,求这两个数,数组如[12,12,12,12,13,13,13,13,14,14,14,21,21,21],最后的期望值应该为14,21
public static void main(String[] args) { //一组数,有两个数出现奇数次 int[] array = new int[]{12,12,12,12,13,13,13,13,14,14,14,21,21,21}; int eor = 0; int tag = 0; int num = 0; for(int i=0;i<array.length;i++){ eor ^= array[i]; } tag = eor & ((~eor) + 1);//右侧第一位1,说明异或前这个位置两个数当前位置一个为1,一个为0 //eor = 11011 (14^21) //tag = 00001 (eor & ((~eor) + 1)) 01 0 00 0 10 11 1 //12 = 01100 //13 = 01101 //14 = 01110 //21 = 10101 for(int i=0;i<array.length;i++){ if((array[i] & tag) != 0){ //01100 & //00001 //00000 num ^= array[i]; } } System.out.println(num + "," + (eor ^ num)); }