Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4568552
  • 博文数量: 385
  • 博客积分: 21208
  • 博客等级: 上将
  • 技术积分: 4393
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 13:40
文章分类

全部博文(385)

文章存档

2015年(1)

2014年(3)

2012年(16)

2011年(42)

2010年(1)

2009年(2)

2008年(34)

2007年(188)

2006年(110)

分类: C/C++

2006-10-30 11:08:54

请编写一个函数 ,让他把一个给定整数的二进制表示形式中的1  的个数统计出来。

首先要注意: 整数在计算机里的内部存储形式已经是他的二进制补码。根本
就不需要进行数值转换。直接统计1的个数,用移位的方法很简单实现。
int   Get1Num( const  int  x)
{
       
       
        int      y=x;
        const  int   mid=0x0001;
        int  count;
     
        while( y)
        {
               if (  y&mid  )  count++;
               y>>=1;
        }
       
        return  count;       
}


但要注意:负数的右移位,是用符号位1来填充的。所以上面的程序不适合负整数.
解决这个问题,
1种办法:可以把给定的整数的二进制表示形式当作一个无符号数来处理.
int   Get1Num( const   int  x)
{
       
       
        unsigned   int      y=x;          //注意这里。
       //  int      y=x; 
        const  int   mid=0x0001;
        int  count;
     
        while( y)
        {
               if (  y&mid  )  count++;
               y>>=1;
        }
       
        return  count;       
}


第2种办法,利用C语言中的左移的特性:始终以0来填充。用左移掩码数,而原整数
                        不动的方法来计数。
                       
int   Get1Num( const   int  x)
{
       
       
        int      y=x;
        int   mid=0x0001;
        int  count;
     
        while( mid)
        {
               if (  y&mid  )  count++;
               mid<<=1;
        }
       
        return  count;       
}
文件:get1Num.tar.gz
大小:0KB
下载:下载

源代码   
阅读(3471) | 评论(6) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-11-09 15:34:57

如果不是32位系统呢

chinaunix网友2008-11-09 15:34:57

如果不是32位系统呢