2-1求二进制中1的个数
可以举一个八位的二进制例子来进行分析。对于二进制操作,我们知道,除以一个2,原来的数字将会减少一个0。如果除的过程中有余,那么就表示当前位置有一个1。
以10 100 010为例;
第一次除以2时,商为1 010 001,余为0。
第二次除以2时,商为101 000,余为1
1可以考虑利用整型数据除法的特点,通过相除和判断余数的值来进行分析
2前面的代码看起来比较复杂。我们知道,向右移位操作同样也可以达到相除的目的。唯一不同之处在于,
移位之后如何来判断是否有1存在。对于这个问题,再来看看一个八位的数字:10 100 001。
在向右移位的过程中,我们会把最后一位直接丢弃。因此,需要判断最后一位是否为1,
而“与”操作可以达到目的。可以把这个八位的数字与00000001进行“与”操作。
如果结果为1,则表示当前八位数的最后一位为1,否则为0。
#include<stdio.h>
#include<conio.h>
int count(int v)
{
int num=0;
while(v)
{
if(v%2==1)
{
num++;
}
v=v/2;
}
return num;
}
int countShift(int v)
{
int num=0;
while(v)
{
if(v&0x01==1)
{
num++;
}
v=v>>1;
}
return num;
}
int main()
{
int n;
int Num;
scanf("%d",&n);
Num=count(n);
int NumShift=countShift(n);
printf("%d %d",Num,NumShift);
getch();
return 0;
}
扩展问题2:给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?
#include<stdio.h>
#include<conio.h>
int countShift(int a, int b)
{
int c=a^b;//把两个整数 A, B 异或, 然后又回归到判断 1 的个数
int num=0;
while(c)
{
if(c&0x01)
{
num++;
}
c=c>>1;
}
return num;
}
int main()
{
int a,b;
int NumShift;
scanf("%d %d",&a,&b);
NumShift=countShift(a,b);
printf("%d\n",NumShift);
getch();
}

浙公网安备 33010602011771号