码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-05-22 21:28:18      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:blank   nbsp   string   target   bsp   void   stat   tar   pre   

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

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来源:百科

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

标签:blank   nbsp   string   target   bsp   void   stat   tar   pre   

原文地址:https://www.cnblogs.com/1994july/p/12939695.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!