笔试面试之查一个数的2进制中有几个1

输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2

 

方法一:每次左移1位,与1做&操作,看是1还是0,终止条件是此数为0,问题是负数怎么办,左移高位就会补零,造成死循环。

方法二:每次与1做&操作,看是不是1移位后的那个数,然后右移1,终止条件是1被移为了0.这个对负数也成立。

方法三:数减去1,就会从最低位开始的第一个1变0,其后的所有0变1,将 num-1 & num 如果不为0 ,那么证明还有1,如此直至这个数

变为0. 问题是对负数不成立。

 

int NumberOf1_Solution1(int i)
{
   
int count = 0;
   
while(i)
    {
      
if(i & 1)
           count ++;

       i = i >> 1;
    }

   
return count;
}

 


int NumberOf1_Solution2(int i)
{
   
int count = 0;
   
unsigned int flag = 1;
   
while(flag)
    {
      
if(i & flag)
           count ++;

       flag = flag << 1;
    }

   
return count;
}

 

 

int NumberOf1_Solution3(int i)
{
   
int count = 0;

   
while (i)
    {
       ++ count;
       i = (i - 1) & i;
    }

   
return count;
}

扩展:如何用一个语句判断一个整数是不是二的整数次幂?

思路:先取绝对值,再来看是否最低位不是1,其他位仅仅含有一个1

转贴自:http://zhedahht.blog.163.com/blog/static/25411174200732102055385/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值