传统方法:
数据右移后与1进行与操作,结果非0表示最右边位位1。存在的缺陷是对于负数将导致死循环。

int GetCountOf1(int curData)
{int curCount = 0;while (curData != 0){if (curData & 1 != 0) ++curCount;curData >> 1;}return curCount;
}

改进方法:
数据保持不动,使用一个标志位依次左移后于该数据进行与操作。虽然解决了传统方法对负数处理时的死循环问题。
不过,不管数据本身中有多少个1,移位操作均需要进行32次(int),效率不高。


int GetCountOf1(int curData)
{int curCount = 0;int flag = 1;while (curData != 0){if (curData & flag != 0) ++curCount;flag << 1;}return curCount;
}

终极方法:
对于0x1000, 0x1000 & (0x1000 - 1) = 0x1000 & 0x0111 = 0;
利用该性质,可以将算法的比较次数降低至数据中的1的位数,同时也没有待处理的数据时正数负数不同带来的问题。

int GetCountOf1(int curData)
{int curCount = 0;while (curData != 0){++curCount;curCount = curCount & (curCount - 1);}return curCount;
}

10. 二进制中1的个数(C++版本)相关推荐

  1. 【剑指offer-Java版】10二进制中1的个数

    二进制中1的个数: 思路一:循环右移给定的数,但是存在负数出现死循环的问题 思路二:声明一个变量flag并初始化为1,然后循环右移flag,循环次数是和给定数的精度也就是位数有关 思路三:用了二进制一 ...

  2. 剑指offer面试题[10]-二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: 这是一道很基本的考察二进制和位运算的面试题.思路:先判断证书二进制表示中最右边的一位是不是1.接着再把输入的数字右移 ...

  3. [剑指offer]面试题10:二进制中1的个数

    面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. ❖ 可能引起死循环的解法 ...

  4. 剑指offer——面试题10:二进制中1的个数

    剑指offer--面试题10:二进制中1的个数 关于负数的自己没想出来,这是书中的两种算法,关于位运算的知识还是得要学习一个啊... Solution1: class Solution {public ...

  5. 《剑指offer》第十五题(二进制中1的个数)

    // 面试题:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inclu ...

  6. 第2章 数字之魅——求二进制中1的个数

    求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二 ...

  7. 《剑指offer》-- 把数组排成最小的数、丑数、二进制中1的个数、表示数值的字符串、替换空格

    一.把数组排成最小的数: 1.题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为 ...

  8. 【剑指offer15.二进制中1的个数】——位操作(左移右移等)

    目录 二进制的表示 二进制的位操作 应用: 剑指offer15.统计二进制中1的个数(多种方法,位右移操作.与操作等) 转自:https://www.jianshu.com/p/3a31065a8e5 ...

  9. C/C++求一个整数的二进制中1的个数

    求一个整数的二进制中1的个数 收藏 题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析:这是一道很基本的考查位运算的面试题.包 ...

  10. 面试题10-二进制中1的个数

    思路: 把一个整数和他减1后的数做位于运算,得到的结果(以10进制的整数给出)相当于把原整数的二进制表示中最右端的1变为0,很多问题都可以这么解决. 2的幂 乘2 除2 2的幂指数次放都可以转化为该数 ...

最新文章

  1. 2021年大数据ELK(一):集中式日志协议栈Elastic Stack简介
  2. 分辨5线单极性步进电机接头
  3. MySQL的char与varchar:类型长度 记录字节 截取报错 保存trim 数据校验 存储占用
  4. 关于操作系统的学习总结
  5. 超一流 | 从XLNet的多流机制看最新预训练模型的研究进展
  6. mat分析dump分析_MAT从入门到精通(一)
  7. ASP.NET 2.0 中动态添加 GridView 模板列
  8. mongodb windows的安装方法和添加到任务管理器中、检测是否成功、增删改查命令...
  9. NHibernate ModelBinder for mvc3
  10. python复盘之windows环境的安装
  11. 阿里云服务器加快下载github
  12. 英语学习/词典app行业top5简要分析
  13. WSO2 ESB 5.0.0 配置 JMS 传输(ActiveMQ)- 主题消息发布与订阅
  14. 两部手机怎样才能把数据都传过来_两台苹果手机怎么传数据最快(两台 iPhone 互传应用的 3 个小技巧)...
  15. 多项式除以多项式例题讲解_多项式乘以多项式训练题.doc
  16. 用Hadoop分析金庸人物关系网-实验报告
  17. efm32芯片电压_谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)
  18. LeetCode日拱一卒
  19. 攻防世界warmup新人小白友好向详细解题过程
  20. MySQL 计算连续涨跌

热门文章

  1. Swarm Mode服务管理
  2. java类的成员变量和局部变量的区别
  3. Windows下Node.js安装Canvas插件
  4. 克劳斯比的零缺陷——《可以量化的管理学》
  5. 发展型机器人:由人类婴儿启发的机器人. 2.6 本章总结
  6. C#多态“说来也说”——逻辑层BLL中的多态使用
  7. RS报内存错误XQE-ROL-0183
  8. 路由器故障排除的思路与理论
  9. 危机中转型,如何获得领导的支持?
  10. 绝对经典的滑轮新闻显示(javascript+css)