位运算(x>>k&1 及 lowbit(x))

**

十进制的位运算

**
常用方法:

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

猜你喜欢

转载自blog.csdn.net/qq_44922497/article/details/113772301
x