博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每天一道算法题(2)——求整数的2进制表示中1的个数
阅读量:5876 次
发布时间:2019-06-19

本文共 920 字,大约阅读时间需要 3 分钟。

Solution1:整数往右移,与1按位与

        不适用负数。因为负数的移位自动填补1,程序陷入死循环

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

Solution 2:1往左移,与数相与

        注意flag定义为unsigned int

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

 Solution3:取反规律 

      任意一个数减1,结果是二进制表示中,最后一个1及其之后位取反。

int NumberOf1_Solution3(int i){      int count = 0;      while (i)      {            ++ count;            i = (i - 1) & i;      }      return count;}
     适用负数,但是负数实际计算的1的个数为其补码中1的个数。
  

引申:1.倘若n&(n-1)==0,则该数为2的整数幂结果。

           2.n|(n+1)统计n中0的个数,如:

int fun(unsigned int x){     int n=0;     while((x+1))     {         n++;         x=x|(x+1);     }     return n;}

转载于:https://www.cnblogs.com/engineerLF/p/5393049.html

你可能感兴趣的文章
js闭包
查看>>
寒假。3.3.G - Common Child (最大公共子序)
查看>>
设计模式学习笔记--原型模式
查看>>
.Net 通过MySQLDriverCS操作MySQL
查看>>
JS Cookie
查看>>
ubuntu Unable to locate package sysv-rc-conf
查看>>
笔记:认识.NET平台
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
【吉光片羽】短信验证
查看>>
MacBook如何用Parallels Desktop安装windows7/8
查看>>
gitlab 完整部署实例
查看>>
GNS关于IPS&ASA&PIX&Junos的配置
查看>>
七天学会ASP.NET MVC (四)——用户授权认证问题
查看>>
upgrade to iOS7,how to remove stroyboard?
查看>>
影响企业信息化成败的几点因素
查看>>
SCCM 2016 配置管理系列(Part8)
查看>>
zabbix监控部署
查看>>
struts中的xwork源码下载地址
查看>>
Android硬件抽象层(HAL)深入剖析(二)
查看>>
CDays–4 习题一至四及相关内容解析。
查看>>