位运算归纳(进阶)
Posted 一只特立独行的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算归纳(进阶)相关的知识,希望对你有一定的参考价值。
为了便于描述,都是以例子的形式进行讲述。是本人在准备蓝桥杯国赛的时候,看视频的归纳,如果有不当之处,还望大家在评论区留言。
1.列举排列情况
如果有30个开关,每次可以随意开n个(0<n<31),要求得到所有的排列情况。(相当的暴力,一般情况下不推荐用,一般这种题用dp做,但是小规模简单题可以用这个方法,代码简单,写的快)
解法:
for(int i=0;i<1<<30;i++){
//pass;
for(int j=0;j<30;j++){
//倒序输出所有排列
cout<<i&1;
i>>1;
}
}
2.判断一个数的二进制位中有几个1,每次从低位消除一个1。
int cnt=0;
while(x!=0){
cnt++;
x&=(x-1);
}
3.找到原数的二进制位从低位到高位第一个1的位置。
x&=(-x);
int cnt=0;
while(x!=0){
x>>1;
cnt++;
}
cout<<cnt;
//输出x的第一个1在第几位
4.在数列a中,除了x只出现了一次,其余数都出现了两次,在a中找x。
原理:0异或上任何数都是他本身,x^x等于0
int x=0;
for(int y : a){
x^=y;
}
cout<<x;
//x就是最终的解
以上是关于位运算归纳(进阶)的主要内容,如果未能解决你的问题,请参考以下文章