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

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

全文目录

 ☘前言☘

 🎁主要知识点

            位与运算

            位与的常见使用

            ✨奇偶判定

            ✨取末尾几位

            ✨消除末尾几位

            ✨判断2的幂

 📓课后习题

             191. 位1的个数

             剑指 Offer 15. 二进制中1的个数

             1356. 根据数字二进制下 1 的数目排序

             762. 二进制表示中质数个计算置位

             231. 2 的幂

 📑写在最后

☘前言☘

今天是算法零基础打卡的第42天,题目本身不难,主要是为了理解位运算的。上链接:

《算法零基础100讲》(第42讲) 位运算 (位与) 入门

全文大约阅读时间: 20min


🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人

✨联系方式:2201891280(QQ)


🎁主要知识点

位与运算

基本逻辑就是与或非,与操作就是两个同为1结果为1,否则为0,真值表如下


x y 结果(x&y)

1 1   1

0 1   0

1 0   0

0 0   0

通过这个真值表我们可以用来取数等操作,我们看下常见的操作


位与的常见使用

✨奇偶判定

- 二进制末位

偶数 0

奇数 1

所以我们很容易写出来代码


if(n&1) xxx;


上面的就是表示判断是否是奇数 因为奇数末尾为1


✨取末尾几位

#include <stdio.h>
int main() {
    int x;
    scanf("%d", &x);
    printf("%d\n", (x & 0b11111) );
    return 0;
}


在计算机中ob是表示的是二进制数,我们把末尾五个作为1其它为零按位与的结果就是最后五位的值。


✨消除末尾几位

#include <stdio.h>
int main() {
    int x;
    scanf("%d", &x);
    printf("%d\n", (x & 0xffffffe0) );
    return 0;
}


相同的道理,如果我们把末尾五位0,其它的置为1就可以抹去最后五位。


✨判断2的幂

2的幂减去1与之相与一定结果是0.

例如 10000000 与 01111111 结果是0


(x & (x-1)) == 0

📓课后习题

191. 位1的个数

191. 位1的个数


编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。


解题思路


按照计算2的幂的思路 每次n&(n-1)会消去最低位的1 所以多次循环就好了。


int hammingWeight(uint32_t n) {
    int count = 0;
    while(n){
        n = n & (n - 1);//消去最低位1
        count ++;
    }
    return count;
}

剑指 Offer 15. 二进制中1的个数

剑指 Offer 15. 二进制中1的个数


编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。


解题思路


直接用位移来比较计算就好了。。换个思路。(这貌似和上题一毛一样。。)


int hammingWeight(uint32_t n) {
    int count = 0;
    for(int i = 0;i < 32;i++)
        if(n & ((uint32_t)1 << i))    count++;
    return count;
}


1356. 根据数字二进制下 1 的数目排序

1356. 根据数字二进制下 1 的数目排序


给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。

如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。

请你返回排序后的数组。

解题思路


人类的本质就是套娃呗?这个就是把昨天的排序api套上今天的位预算康康。


int cmp(int *a,int *b){
    int lena = 0,lenb = 0;
    for(int i = 0; i < 32;i++){//算1的个数
        if((*a)>>i&1)   lena++;
        if((*b)>>i&1)   lenb++;
    }
    if(lena == lenb)    return *a > *b;//一样直接比大小
    return lena > lenb; //不一样升序排列
}
int* sortByBits(int* arr, int arrSize, int* returnSize){
    qsort(arr,arrSize,sizeof(int),cmp);
    *returnSize = arrSize;
    return arr;
}


762. 二进制表示中质数个计算置位

762. 二进制表示中质数个计算置位


给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。

(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。)


解题思路


看了看数据范围,最多也就只有撑死也就有20个1 所以我把20以内所有的质数干了个表,查表就完事了。这我没用任何算法,20以内。直接算就完事了。。。


bool f[21] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0};//质数表
bool isright(int n){
    int len = 0;
    for(int i = 0;i <32;i++)
        if((n>>i) & 1)  len++;//统计个数
    return f[len];    //是否是质数
}
int countPrimeSetBits(int left, int right){
    int ans = 0;
    while(left<=right)
        if(isright(left++))   ans++;  //判断是否符合条件
    return ans;
}


231. 2 的幂

231. 2 的幂


给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。


解题思路


根据大哥说的,算就完事了。注意<=0都是false


bool isPowerOfTwo(int n){
    if(n <=0 ) return false;
    return !(n &(n-1));
}


一行代码版


bool isPowerOfTwo(int n){
    return n <=0 ? false : !(n &(n-1));
}
相关文章
|
5月前
|
存储 算法
算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!
给定一个正整数数组和目标值target,找出总和大于等于target的最短连续子数组长度。利用滑动窗口(双指针)优化,维护窗口内元素和,通过单调性避免重复枚举,时间复杂度O(n)。当窗口和满足条件时收缩左边界,更新最小长度,最终返回结果。
|
5月前
|
存储 算法
算法入门:专题一:双指针(有效三角形的个数)
给定一个数组,找出能组成三角形的三元组个数。利用“两边之和大于第三边”的性质,先排序,再用双指针优化。固定最大边,左右指针从区间两端向内移动,若两短边之和大于最长边,则中间所有组合均有效,时间复杂度由暴力的O(n³)降至O(n²)。
|
5月前
|
存储 算法 编译器
算法入门:剑指offer改编题目:查找总价格为目标值的两个商品
给定递增数组和目标值target,找出两数之和等于target的两个数字。利用双指针法,left从头、right从尾向中间逼近,根据和与target的大小关系调整指针,时间复杂度O(n),空间复杂度O(1)。找不到时返回{-1,-1}。
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
682 1
|
8月前
|
机器学习/深度学习 数据采集 算法
你天天听“数据挖掘”,可它到底在“挖”啥?——数据挖掘算法入门扫盲篇
你天天听“数据挖掘”,可它到底在“挖”啥?——数据挖掘算法入门扫盲篇
176 0
|
12月前
|
机器学习/深度学习 算法 机器人
强化学习:时间差分(TD)(SARSA算法和Q-Learning算法)(看不懂算我输专栏)——手把手教你入门强化学习(六)
本文介绍了时间差分法(TD)中的两种经典算法:SARSA和Q-Learning。二者均为无模型强化学习方法,通过与环境交互估算动作价值函数。SARSA是On-Policy算法,采用ε-greedy策略进行动作选择和评估;而Q-Learning为Off-Policy算法,评估时选取下一状态中估值最大的动作。相比动态规划和蒙特卡洛方法,TD算法结合了自举更新与样本更新的优势,实现边行动边学习。文章通过生动的例子解释了两者的差异,并提供了伪代码帮助理解。
925 2
【算法】位运算合集
/鸽巢原理优化//位图原理//bitMap&0001000只有非0或者0两个结果//说明当前bitMap位是0,那就添加进去}else{//1:把字符串转化为字符数组// //2:把字符扔到hash表中// //获取hash表中x的value值// }else{// }// }
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
225 0
|
5月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
497 0
|
5月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
325 2

热门文章

最新文章