0
点赞
收藏
分享

微信扫一扫

求一个整数用二进制表示是中1的个数

1.1的二进制数中只有一个1其余为0,若用1的二进制中的1不断左移且每次与整数的二进制数比较是否一样,每次一样时记录下来

,最后就能将整数里二进制数里的所有1出现的次数记录下来

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>

int main()
{
int num = 0;
unsigned int flag = 1;//先定义一个变量未无符号的1
int count = 0;
scanf("%d", &num);
while (flag)//若1左移超出最高位时,变量的值变为0,0为假
{
if (num & flag)//若二进制中当前变量flag中1所在的位数与num中相同位数上的值也为1
{
count++;//记录一次
}//否则跳过
flag = flag << 1;//变量flag的二进制数值每次循环左移1位
}
printf("count=%d", count);//打印出最终记录的值
return 0;
}

2.与上面方法相反,该方法是不断将整数的二进制数右移一位与1的二进制数比较,再记录下来

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>

int main()
{
int num = 0;
int count = 0;
int i = 0;
scanf("%d", &num);
for (i = 0; i < 32; i++)//超过整型所占单位4字节32个比特位时,循环结束
{
if (1 == ((num >> i) & 1))//如果num的二进制数值右移i位(i的值1到32)最后一位的值与1相同
{
count++;//记录一次
}//否则跳过
}
printf("count=%d", count);//打印出最终记录的值
return 0;
}

3.因为二进制里满二进一,所以除二也有去一的效果

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>

int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
while (num)//缺陷:无法计算负数里的1的个数
{
if (num % 2 == 1)//每次num除不尽时
{
count++;//记录一次
}
num = num / 2;//num的值每次除2
}

printf("count = %d\n", count);//打印出最终记录的值
return 0;
}
举报

相关推荐

0 条评论