整理左神讲的,用于以后复习

今天听了一节课,有点叼啊,之前不明白的地方,今天一下子明白了

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));
}
 l来源: 百科

猜你喜欢

转载自www.cnblogs.com/1994july/p/12939695.html
今日推荐