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();
}

 

posted @ 2011-11-23 23:36  nba76ers  阅读(312)  评论(0)    收藏  举报