程序竞赛——位运算常用操作
2021/10/24 17:12:07
本文主要是介绍程序竞赛——位运算常用操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
位运算
&
与
|
或
~
非
^
异或
>>
右移
<<
左移
常用操作:
(1) 求x的第k位数字 x >> k & 1
(2) lowbit(x) = x & -x
,返回x的最后一位1
求整数的二进制数表示中的第k位是几?
n = 15 =(1111)2 :从0位开始的(右到左)
- 先把第k位移到最后一位 n >> k (将第k位移到了个位上)
- 看个位是几 x&1
总结:1、2汇总: n >> k & 1
int n = 10;// 1010 for(int k = 3;k >= 0; k--)// 4位数的二进制数 cout<< (n >> k & 1); // 1010
lowbit(x):返回x的最后一位1
lowbit()函数用来取一个二进制最低位的1与后边的0组成的数。
应用:统计x中1的个数(每次把最后一个1去掉)
x = 1010 lowbit(x) = 10
x= 101000 lowbit(x) = 1000
实现原理:x & -x
= x & (~x + 1)
,负数的补码:原码取反加一。利用了负整数的补码特性
【例题】acwing801. 二进制中1的个数
【方法一】传统思路:先将十进制数转为二进制数,然后统计出现1的个数(遍历判断)
#include<iostream> using namespace std; const int N = 100000+10; int q[N]; // 将十进制数转为二进制数并统计1的个数 int count(int n) { int k = 0, ans = 0; while(n != 0) { q[k++] = n % 2; n = n / 2; } for(k--; k >= 0; k--) { if(q[k] == 1) ans++; } return ans; } int main() { int n; cin>>n; while(n--) { int x; cin>>x; cout<<count(x)<<" "; } return 0; }
【方法二】位运算
#include<iostream> using namespace std; int lowbit(int x) { return x & (-x); } int main(){ int n; cin>>n; while(n--) { int x; int res = 0; cin>>x; while(x) { x -= lowbit(x); // 减去每一次的最后一位1 res++; } cout<<res<<" "; } return 0; }
总结:
求n的第k位数字: n >> k & 1
。
返回n的最后一位1:lowbit(x) = x & -x
。应用:求某一个数的二进制有多少位1。
注:如果文章有任何错误或不足,请各位大佬尽情指出,评论留言留下您宝贵的建议!如果这篇文章对你有些许帮助,希望可爱亲切的您点个赞推荐一手,非常感谢啦
这篇关于程序竞赛——位运算常用操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南