位运算及模板
1.位运算的问题引出及解决方案
关于位运算,有两个常见问题。
1. 给定一个数n,对于n的二进制表示,求其第k位是几。(注意:k是从0 开始编号)。
2. 编写一个函数lowbit (x),返回x的二进制表示的最后一位1 (这里的x为正数/负数/0 均可)。
例如:
x = 1010 lowbit (x) = 10
x = 101000 lowbit (x) = 1000
由上述案例可知:lowbit (x)返回的都是二进制数。
对于lowbit (x)函数,是日后理解树状数组的基石。lowbit (x)函数主要用来解决:一个二进制数中有多少个1 这样的问题。这个问题,我们将在例题中进行讲解。
关于上述问题的解决方案如下:
1. 对于第一个问题,我们需要分两步解决:
1. 先把第k位移到最后一位:n >> k
2. 看个位是几:x & 1 (其中:x = n >> k)
把前两步综合起来,就得到了公式:
n >> k & 1
2. 对于第二个问题,只需要一个公式即可:
function lowbit (x )
return x & -x
需要注意:C++中的右移符号是看操作数是什么类型的。如果是无符号类型,那么就是逻辑右移,如果是有符号类型,那么就是算数右移。
2. 位运算模板
求n的第k位数字: n >> k & 1
返回n的最后一位1 :lowbit (n) = n & -n
3. 例题
1. 给定一个数字n,求n的二进制,并输出
#include <iostream>
#include <cstdio>
using namespace std ;
int main () {
int n;
int k = 0 ;
int number[100010 ];
scanf ("%d" ,&n);
for (int i=0 ;i<32 ;i++){
number[i] = n >> i & 1 ;
}
for (int i=31 ;i>=0 ;i--){
printf ("%d" ,number[i]);
}
return 0 ;
}
上述是-20在计算机中的二进制表示(补码)
https: //www.acwing.com/problem /content/ 803 /
给定一个二进制数,求其包含多少个1 ,我们可以采用如下做法去计算:
1 . 首先通过lowbit (x)函数,找到这个二进制数的最后一个1 (二进制数)。
2 . 更新原来的二进制数,将lowbit (x)所得到的最后一个1 减掉。[x = x - lowbit(x)] 。
3 . 重复上述操作,上述操作重复了多少次,二进制数里面就会有多少个1 。直到二进制数中没有1 为止。(即:x = 0 )。
#include <iostream>
#include <cstdio>
using namespace std ;
int lowbit (int x) {
return x & -x;
}
int main () {
int n;
scanf ("%d" ,&n);
int q[100010 ];
for (int i=0 ;i<n;i++){
scanf ("%d" ,&q[i]);
}
for (int i=0 ;i<n;i++){
int res = 0 ;
while (q[i]){
q[i] -= lowbit(q[i]);
res++;
}
printf ("%d " ,res);
}
return 0 ;
}
作者:gao79138
链接:https://www.acwing.com/
来源:本博客中的截图、代码模板及题目地址均来自于Acwing。其余内容均为作者原创。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具