用C语言统计二进制中1的个数的3种方法

 计算机是以二进制补码的形式存储,例如:13   00000000 00000000 00000000 00001101 -----原码,反码,补码

正数的原码 反码 补码 相同

-1

10000000 00000000 00000000 00000001 ----原码

11111111 11111111 11111111 11111110 -----反码(按位去反,符号位不变)

11111111 11111111 11111111 11111111 ------补码(反码+1)

负数的最高位为符号位

#include<stdio.h>

int count_one_bits_one(unsigned int n){ //无符号整形使负数的符号位变为有效数位
	int i=0,count=0;
	while(n){
		if(n%2 == 1)
			count++;
		n /=2;	
	}
	return count;
}
int main(){
	int n;
    printf("请输入一个数:\n");
	scanf("%d",&n);
	int count = count_one_bits(n);
	printf("二进制中1的个数:%d\n",count);
	return 0;
}

 二进制中的补码每一位都按位与上一个1,就得到二进制的每一位

& ---按位与---同1才1

>>左移操作符

00000000 00000000 00000000 00001101 -----13的补码

 

00000000 00000000 00000000 00000001 ------1的补码

#include<stdio.h>

count_one_bits_two(int n){
	int i=0,count=0;
	while(i<32){
		if((n>>i)&1 == 1)
			count++;
		i++;
	}
	return count;
}
int main(){
	int n;
	printf("请输入一个数:\n");
	scanf("%d",&n);
	int count = count_one_bits_two(n);
	printf("二进制中1的个数:%d\n",count);
	return 0;
}

 

13与12

00000000 00000000 00000000 00001101

00000000 00000000 00000000 00001100

一次取下一个1,循环几次就取下几个1。

int count_one_bits_three(int n){
	int count=0;
	while(n){
		n = n&(n-1);
		count++;
	}
	return count;
}
int main(){
	int n;
	printf("请输入一个数:\n");
	scanf("%d",&n);
	int count = count_one_bits_three(n);
	printf("二进制中1的个数:%d\n",count);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值