要统计一个整数二进制中1的个数,首先我们会想到最简单的方法就是 % 2 再 / 2,然后判断每一位是否为1。

但是,如果这是一个很大的数,频繁的除法运算效率不是很高。而位运算比乘除法效率高,所以我们就来用位运算解决这道题。

首先方法一,当num大于0时,判断num & 1 的值,即可知道最后一位的值,循环每次num右移一位,即可完成目标。

然后方法二,num & 0x55555555 + ((num >> 1) & 0x55555555) 5的二进制为0101,按位与可以得到num的二进制中相邻两位1的个数,例如:
98 二进制为:0110 0010
0110 0010 & 0x55555555 == 0110 0010 & 0101 0101 0101 0101 0101 0101 0101 0101
得到: 0100 0000
(0110 0010 >>1) & 0x55555555 == 0011 0001 & 0101 0101 0101 0101 0101 0101 0101 0101
得到:0001 0001
相加得到: 0101 0001
此时我们已经统计到了相邻两位1的个数
0x33333333 == 0011 0011 0011 0011 0011 0011 0011 0011就是统计相邻四位的1的个数
0x0f0f0f0f == 0000 1111 0000 1111 0000 1111 0000 1111就是统计相邻八位的1的个数

直到 0xffff == 0000 0000 0000 0000 1111 1111 1111 1111 统计相邻32位的1的个数,那么在32位系统中,此时num的值就是一个整数的二进制1的个数。

#include<iostream>
using namespace std;//查找输入整数的二进制中1的个数
int findNumberOf1(int num)
{//方法二:平行算法num = (num & 0x55555555) + ((num >> 1) & 0x55555555);//num = (num & 0x33333333) + ((num >> 2) & 0x33333333);num = (num & 0x0f0f0f0f) + ((num >> 4) & 0x0f0f0f0f);num = (num & 0xff00ff) + ((num >> 8) & 0xff00ff);num = (num & 0xffff) + ((num >> 16) & 0xffff);return num;/*//方法一:按位int count = 0;while(num){if(num & 1){count++;}num >>= 1;}return count;*/
}int main()
{int num;while (cin >> num){cout << findNumberOf1(num) << endl;}return 0;
}

整数二进制中1的个数相关推荐

  1. 华为机试HJ62:查找输入整数二进制中1的个数

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个正整数,计算它在二进制下的1的个数. 注意多组输入输出!!!!!! 输入描述 ...

  2. 【day15】每日强训编程题——查找输入整数二进制中1的个数手套

    查找输入整数二进制中1的个数_牛客题霸_牛客网 这道题非常简单,就一个思路: 按位与& 任何一个数按位与上1,如果这个数二进制的最后一位是1,那么按位与的结果就是1,否则就是0 代码思路:n按 ...

  3. 【华为机试题 HJHJ62】查找输入整数二进制中1的个数

    HJ62 查找输入整数二进制中1的个数 一.题目描述 二.参考代码1 三.参考代码2 一.题目描述 输入一个正整数,计算它在二进制下的1的个数. 注意多组输入输出!!!!!! 二.参考代码1 位运算; ...

  4. 判断32位整数二进制中1的个数

    在面试中被问到这一题:判断32位无符号整数二进制中1的个数,虽然不难,但要求层层优化.现在整理一下: 1.基本思路: #include <iostream> using namespace ...

  5. 05-04 求负数二进制中1的个数

    # 求整数二进制中1的个数? # 若整数为整数,直接求二进制,将其转为str遍历判断是否1, # 若为负数,求其补码,再解题, 问:整数二进制指的补码还是原码?def count1(n):print( ...

  6. Java 数值的二进制中1的个数和整数次方

    1. 数值的二进制中1的个数 1.1 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 1.2 解题思路 思路一:直接使用java自带的函数Integer.toBinaryS ...

  7. C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)

    题目: 实现一个函数,输入一个整数,输出该数二进制中1的个数.例如把9表示成二进制是1001,有2位是1,因此如果输入是9,该函数输出2 第一种解法(死循环) 判断整数二进制表示中最右边的一位是不是1 ...

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

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

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

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

最新文章

  1. mysql安装教程博音网_RTSP视频平台EasyNVR使用mysql数据源启动报错unknow drivermysql优化...
  2. Win7 + VS2015 + Python3.6编译
  3. 初接触php,遇到一个低级问题
  4. python3 重新运行本程序_python-3.x – 在py.test测试中重新启动python(或重新加载模块)...
  5. Bootstrap3 滚动监听插件的事件
  6. Git笔记(22) 项目贡献要点
  7. SQL语句查询条数不足10行时如何自动补充空行
  8. 高并发的常见策略--大型web项目
  9. 计算机组成原理-复习题2
  10. STS安装lombok插件
  11. PX4日志读取并转化为.scv文件、MATLAB显示
  12. 华为交换机密码重置(在S5720系列上验证)
  13. conda管理python开发环境
  14. 在eclipse启动tomcat运行一个web程序,报java.lang.OutOfMemoryError: PermGen space
  15. IE浏览器不能上网其他浏览器可以解决办法
  16. 聊天会话常用JS/CSS代码
  17. 常见的导数公式及证明
  18. 04741计算机网络原理2018年版-第七章 无线与移动网络 知识要点
  19. macbook电脑连接Wi-Fi网速慢
  20. ERP不规范,同事两行泪

热门文章

  1. 背光模组的基本结构与应用
  2. 北斗网格码:数字孪生城市 CIM 时空网格框架
  3. Centos7根目录扩容方法(添加一块磁盘扩容根目录)
  4. 数据库:简述对关系型数据库(RDBMS)的认识
  5. Vue多选框保留勾选数据
  6. 50个优秀手机界面设计
  7. 前端页面语言国际化,实现中英切换
  8. 背调公司要我提供个税APP的录屏和截图,这违法吗?
  9. 遍历多个数组 合并数组
  10. RTK差分共享猫APP下载地址