1.统计一个整数的二进制数中所含1的个数。
简单代码:
int count_bit_one(int n)
{
int count=0;
while(n)
{
if(n%2==1)
{
count++;
}
n=n/2;
}
return count;
}
#include<stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
int count=count_bit_one(n);
printf("%d\n",count);
return 0;
}
但此代码存在缺陷:当输入的n为负数的时候,不能得到正确的结果。
可以对函数定义模块进行改造,有以下改造方法。
方法一:
int count_bit_one(unsigned int n)//将传进的实参值转换为无符号数(unsigned int)可以解决此问题
{
int count=0;
while(n)
{
if(n%2==1)
{
count++;
}
n=n/2;
}
return count;
}
方法二:
int count_bit_one(int n)
{
int i=0;
int count=0;
for(i=0;i<32;i++)
{
if(((n>>i)&1)==1)
{
count++;
}
}
return count;
}
方法三:
int count_bit_one(int n)
{
int count=0;
while(n)
{
n=n&(n-1);
count++;
}
return count;
}
通过对函数定义模块进行以上改造,可以得到预期结果。其中方法三为最优解。
2.求二进制数中不同位的个数。
int get_diff_bit(int m,int n)
{
int tmp=m^n;
int count=0;
while(tmp)
{
tmp=tmp&(tmp-1);
count++;
}
}
int main()
{
int m=0;
int n=0;
scanf("%d%d",&m,&n);
int count=get_diff_bit(m,n);
printf("%d\n",count);
return 0;
}
3.获取二进制中的奇数位和偶数位。
void print(int a)
{
int i=0;
printf("奇数位:");
for(i=30;i>=0;i-=2)
{
printf("%d ",(a>>i)&1);
}
printf("偶数位:");
for(i=31;i>=0;i-=2)
{
printf("%d ",(a>>i)&1);
}
}
int main()
{
int a=0;
scanf("%d",&a);
print(a);
return 0;
}