**
十进制的位运算
**
常用方法:
1.x>>k&1
(1)x>>k
x>>k表示右移k位,
假设:x=10 == (1010)2 , k=1;
那么 x>>k 表示(1010)2右移了1位 结果为 (101)2
k=2的话 结果为(10)2
…
以此类推
如:
void f( int x){
//举例x=10 == (1010)2
while(x){
cout<<(x>>1)<<endl;//显示的值为十进制
x=x>>1;
}
/*输出显示为:
5
2
1
0
*/
}
(2)x&1
x&1代表最低位的值(最右位的值)
假设:x=10==(1010)2
那么 x&1 == 0
如:
void f(){
cout<<(10&1)<<endl;
cout<<(1&1)<<endl;
cout<<(2&1)<<endl;
/*输出显示为:
0
1
0
*/
}
(3)x>>k&1
组合使用
void f( int x){
//举例x=10 == (1010)2
while(x){
cout<<(x>>0)<<" "<<(x&1)<<endl;//显示的值为十进制
x=x>>1;
}
/*输出显示为:
10 0
5 1
2 0
1 0
*/
}
2.lowbit(x)
int lowbit(int x){
return x&(-x);
}
lowbit(x)是返回x的最低位1表示的值(十进制)
假设x=10==(1010) 返回的为 (10)2 == 2
(1000)2返回的为 (1000)2 = 8
(10001)2返回为 (1)2 = 1
…
以此类推
3.组合使用(x>>k&1)和lowbit(x)
如题:https://www.acwing.com/problem/content/803/
二进制中1的个数
给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。
输入格式
第一行包含整数n。
第二行包含n个整数,表示整个数列。
输出格式
共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。
数据范围
1≤n≤100000,
0≤数列中元素的值≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int n,a[N];
int lowbit(int x){
return x&(-x);
}
int main(){
cin>>n;
for(int i=1,t=0;i<=n;++i) {
cin>>a[i];
int x = a[i];
while(x){
if(lowbit(x)) t++;
x/=lowbit(x);
x=x>>1;
}
printf("%d ",t);
t=0;
}
return 0;
}
over