1.问题:
随意输入一个整数,求这个整数用二进制表示时1出现的次数。
2.代码:
1)用 按位与&1
#include<stdio.h>
size_t Num_bit_one(int n)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if (1 == ((n>>i) & 1))
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
printf("请任意输入一个整数:");
scanf("%d", &n);
int ret= Num_bit_one(n);
printf("二进制时1的个数为:%d",ret);
return 0;
}
2)用%2 /2法-注意负数-应该使用 unsigned int 类型 (不是绝对值!)
#include<stdio.h>
size_t Num_bit_one(unsigned int n)//负数等价转换为正数-去绝对值不行!
// //eg.-1 1(取绝对值) 32个1(无符号)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n /= 2;
}
return count;
}
int main()
{
unsigned int n = 0;
printf("请任意输入一个整数:");
scanf("%u", &n);
unsigned int ret = Num_bit_one(n);
printf("二进制时1的个数为:%u", ret);
return 0;
}
3)用 n=n&(n-1) --大致写出几个二进制表示即可得到规律
// n=n&n(n-1) -由写出的几个数找出规律!
#include<stdio.h>
size_t Num_bit_one(int n)
{
int count = 0;
while (n)//n不为0!!-已经必定含有1-必要!
{
n = n & (n - 1);//1的个数等于可执行n & (n - 1)次数 直至为0结束
count++;
}
return count;
}
int main()
{
int n = 0;
printf("请任意输入一个整数:");
scanf("%d", &n);
int ret = Num_bit_one(n);
printf("二进制时1的个数为:%d", ret);
return 0;
}
3.运行结果:
PS.主要注意第三种写法!
K-