位运算相关

1.两个数相加,不能用加号

两个数异或:相当于每一位相加,而不考虑进位;

两个数相与,并左移一位:相当于求得进位;

将上述两步的结果相加

public int Add(int num1,int num2) {
        while( num2!=0 ){
            int sum = num1 ^ num2;
            int carray = (num1 & num2) << 1;
            num1 = sum;
            num2 = carray;
        }
        return num1;
}

 2.统计n的二进制中1的个数

,我们只需要知道n的二进制数中拿掉最右边的那个1的数的1的个数加1就行

public int[] countBits(int num){
         int[] dp=new int[num+1];
         for(int i=1;i<=num;i++){
                dp[i]=dp[i&(i-1)]+1;
         }
         return dp;
}

 3.统计一个长数组中,唯一不成对的两个数。

如果是单独的一个数,就直接全部异或,单独的两个数首先求出他们两个的异或,然后再把这部分数分成两部分,分别与这个数异或,就可以把这两个数单独拿出来了。

public void findAlone(int[] a) {
        int hxor=0;
        int flag=1;
        for(int i=0;i<a.length;i++) {
            hxor^=a[i];
        }
        //找到总的异或结果中从右往左的第一个1
        while((hxor&flag)==0) flag<<=1;
        int num1=hxor;
        int num2=hxor;
        for(int i=0;i<a.length;i++) {
            if((a[i]&flag)==0) {
                num1^=a[i];
            }
            else
            {
                num2^=a[i];
            }
        }
        System.out.println(num1+"--"+num2);
   }

 

posted @ 2019-07-24 16:02  LeeJuly  阅读(113)  评论(0)    收藏  举报