leetcode上的位运算

136-只出现过一次的数字

思路:可以考虑到数字以二进制形式存储,当两个不同的数字异或的时候会是true,所以把数组里的数字都一一处理一遍就可以了。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int res=0;
        for(auto num:nums) res^=num;
        return res;
    }
};

201-数字范围按位与

思路:m和n每次向右平移一位直到相等为止,记录下平移的次数i,然后让m往左平移i位即为所求

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        int i=0;
        while(m!=n){
            m>>=1;
            n>>=1;
            i++;
        }
        return (m<<i);
    }
};

477-汉明距离总和

思路:规律查找发现,每一位上1的数量乘于0的数量就是当前位的结果,然后统计相加就可以得出结果了。

class Solution {
public:
    int totalHammingDistance(vector<int>& nums) {
        int res=0,n=nums.size();
        for(int i=0;i<32;i++){
            int cnt=0;
            for(int num:nums){
                if(num&(1<<i)) cnt++;
            }
            res+=cnt*(n-cnt);
        }
        return res;
    }
};

421-最大异或值

思路:

868-二进制间距

思路:

posted @ 2019-09-29 13:59  codeg  阅读(143)  评论(0编辑  收藏  举报