位运算
预备知识
首先注意二进制位数从0开始记录,即
15=(1111),位数分别为3210
左移和右移
左移 << 将某个数的二进制向左移动几位,低位补0
如5>>2 即20
,左移k位即相当于乘上2的k次方
右移 >> 将某个数的二进制向右移动几位
如100<<4 即6
,左移k位即相当于除以2的k次方与运算
对二进制按位进行与运算
对于一个数字k,k&1
的结果就是k最后一位的二进制数,因为1的二进制是0001,k前面的位都被&为0了。
位运算应用
- 求数字n的第k位二进制是几
由于二进制是从0开始标记位数的,因此n>>k就使得最后一位是第k位置,
求该位置是几,&1即可
即(n>>k)&1
- 那么其实我们也能以此得出输出某个数字二进制简便方法:
int n=100;
for(int i=6;i>=0;i--){
cout<<(n>>i&1);
}
其中i的初值就取该数二进制有多少位(这个自己求)
- 介绍lowbit()运算
lowbit就是返回某个数最后一个1的位数(以及后面的0)。例:
lowbit(52).
52=(110100)
故lowbit(52)=100
lowbit实现原理:
二进制中1的个数
- 我自己写的通过“求数字n的第k位二进制是几”得到1的个数
思路就是逐位求出n的二进制表示然后统计
#include<iostream>
using namespace std;
int n;
int solve(int x){
int tmp=x;
int nn=0;//位数
int num=0;//有多少个1
while(tmp!=0){
tmp/=2;nn++;
}
for(int i=nn-1;i>=0;i--){
if((x>>i)&1==1)
num++;
}
return num;
}
int main(){
int n,x;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
cout<<solve(x)<<" ";
}
return 0;
}
- !使用lowbit()运算!
#include<iostream>
using namespace std;
int lowbit(int x){
return x&(-x);
}
int n,x;
int main(){
cin>>n;
while(n--){
cin>>x;
int res=0;
while(x) {
x-=lowbit(x);
res++;
}
cout<<res<<" ";
}
return 0;
}