[解题报告]《算法零基础100讲》(第42讲) 位运算 (位与) 入门


前言

跟着英雄哥打卡第四十二天
[专题跳转->《算法零基础100讲》]
[万人千题社区跳转]
[LeetCode零基础指南]


一、位1的个数

跳转力扣:191. 位1的个数
难度:★☆☆☆☆

说明:位运算,判断最低位是否为1,是则加1,每次循环右移一位继续判断

代码如下(示例):

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int ans = 0;
        while (n) {
            if (n & 1)
                ans ++;
            n >>= 1;
        }
        return ans;
    }
};

二、二进制中1的个数

跳转力扣:剑指 Offer 15. 二进制中1的个数
难度:★☆☆☆☆

说明:位运算,与上题相同,提供另一个方法,参考 lowbit(x) 方法: lowbit(x) x x x 的二进制表达式中最低位的1所对应的值。如 6 6 6 的二进制是 110,所以 l o w b i t ( 6 ) = 2 lowbit(6) = 2 lowbit(6)=2 n − l o w b i t ( n ) = 6 − l o w b i t ( 6 ) = 6 − 2 = 4 = ( 100 ) n - lowbit(n) = 6 - lowbit(6) = 6 - 2 = 4 = (100) nlowbit(n)=6lowbit(6)=62=4=(100)2

代码如下(示例):

class Solution {
public:
    int lowbit(uint32_t x){
        return x & (-x);
    }
    int hammingWeight(uint32_t n) {
        int ans = 0;
        while (n){
            n -= lowbit(n);
            ans ++;
        }
        return ans;
    }
    
};

三、根据数字二进制下 1 的数目排序

跳转力扣:1356. 根据数字二进制下 1 的数目排序
难度:★☆☆☆☆

说明:位运算,排序,计算每一个数二进制1的个数,根据个数从小到大排序即为答案所求

代码如下(示例):

typedef pair<int, int> pii;
class Solution {
public:
    vector<int> sortByBits(vector<int>& arr) {
        int n = arr.size();
        vector<pii> ans;
        vector<int> res;
        for (int i = 0; i < n; i ++) {
            int cnt = 0;
            pii p;
            p.second = arr[i];
            while (arr[i]) {
                if (arr[i] & 1)
                    cnt ++;
                arr[i] >>= 1;
            }
            p.first = cnt;
            ans.push_back(p);
        }
        sort(ans.begin(), ans.end());
        for (auto &a: ans)
            res.push_back(a.second);
        return res;
    }
};

四、二进制表示中质数个计算置位

跳转力扣:762. 二进制表示中质数个计算置位
难度:★☆☆☆☆

说明:位运算,计算从 l e f t left left r i g h t right right 的每一位数的二进制数中1出现的个数,再判断个数是否为质数,是则计数加①

代码如下(示例):

class Solution {
public:
    bool isPrime(int n) {
        if (n < 2) return false;
        for (int i = 2; i <= n / i; i ++) {
            if (n % i == 0)
                return false;
        }
        return true;
    }
    int countPrimeSetBits(int left, int right) {
        int ans = 0;
        for (int i = left; i <= right; i ++) {
            int cnt = 0;
            int n = i;
            while (n) {
                if (n & 1)
                    cnt ++;
                n >>= 1;
            }
            if (isPrime(cnt))
                ans ++;
        }
        return ans;
    }
};

五、2 的幂

跳转力扣:231. 2 的幂
难度:★☆☆☆☆

说明:位运算,参考题二 lowbit(x)方法

代码如下(示例):

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n > 0 && (n & -n) == n;
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值