写一个函数返回参数中二进制中1的个数(三种方法)

输入一个整数n,输出该数32位二进制表示中1的个数,其中负数用补码表示

写一个函数返回参数中二进制中1的个数

法一:类似于之前写的求十进制的一个数的每一位https://blog.csdn.net/qq_45917670/article/details/142497010?spm=1001.2014.3001.5502

如n=5(二进制0101)

n%2=1,count+1=1,n=5/2=2,

n%2=0,count不变,2/2=1,

1%2=1;count+1=2,1/2=0,循环停止

int count_num_of_1(unsigned int n){
	int count=0;
	while(n){
	if((n%2)==1){
		count++;
	}
	n/=2;	}
	return count;
}

法二:将32为二进制位依次与1相与(0&1=0,1&1=1),计算相与等于1的共多少位

int count_num_of_1(int n){
	int i=0;
	int count=0;
	for(i=0;i<32;i++){
		if(((n>>1)&1)==1){
				count++;
		}
	}
	return count;
}

法三:通过n&(n-1 )判断

1111 n
1110 n-1
 1110 n
1101 n-1
1100 n
1011 n-1
1000 n
0111 n-1
0000 n

n&(n-1)每次都会消去n最左边的1,直至n=0

另外还可用此方法判断一个数是否为2的n次方,n&(n-1)==0即为2的n次方

如n=4(二进制0100)n-1=0011,(0100)&0011=0

int count_num_of_1(int n) {
	int count=0;
	while(n) {
		n=n&(n-1);
		count++;
	}
	return count;
}

主函数:

int main() {
	int num=0;
	scanf("%d",&num);
	int n=count_num_of_1(num);
	printf("%d\n",n);
	return 0;
}

运行结果:

10的二进制:1010

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值