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

#include <iostream>

using namespace std;

int findone(unsigned int n){
  for(int i=0;n>0;n>>=1)
    i+=(n&1);
  return i;
}

int main(){
  int n;
  cin>>n;
  cout<<findone(n)<<endl;
  return 0;
}

2、优化:
这样的时间复杂度是T(m)=m,取决于二进制数的位数m。如果要求在更短时间内求出,应该如何做呢?如果findone函数被反复调用(成千上万次调用),那应该怎么优化呢?
其实就是空间换时间的思想:可以预建立一个表,存放了从0~2^32每个数中1的个数,用时去查一下表就知道了。但这样显然要耗费很多的空间(至少2^32/(256/32)=512MB,哈哈,正是一般内存大小)。于是需要再优化:存放0-255每个数中1的个数,然后分段查询。如下面把32位数分为4段,每段一个字节,所以有一个256大小供查询的表:

char tOne[256]="\0\1\1\2\1\2……"; //后面省略

int findone(unsigned int n){
  for(int i=0;n>0;n>>=8)
    i+=tOne[n&255];
  return i;
}

3、据说Intel中有条汇编指令(或是数条)即可完成这个工作,但不知道具体是什么,应该怎样做。
4、又看到有道MS的笔试题殊途同归:

int func(unsigned int n){
  int count=0;
  while(n>0){
    n&=(n-1);
    count++;
  }
  return count;
}

判断32位整数二进制中1的个数相关推荐

  1. 整数二进制中1的个数

    要统计一个整数二进制中1的个数,首先我们会想到最简单的方法就是 % 2 再 / 2,然后判断每一位是否为1. 但是,如果这是一个很大的数,频繁的除法运算效率不是很高.而位运算比乘除法效率高,所以我们就 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 剑指 Offer 15. 二进制中1的个数 + 191. 位1的个数(n(n-1)实例)

    一.题目:剑指 Offer 15. 二进制中1的个数 请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此, ...

最新文章

  1. Swift3.0语言教程使用路径字符串
  2. conrtex 和 ARM 的关系
  3. 【学习笔记】JS进阶语法一window对象
  4. 从listView1中选择记录到listView2中
  5. 什么时候需要好教材和好教材是怎样的
  6. Virtual DOM(虚拟dom-2)
  7. mysql char(36)_MySQL中char(36)被認為是GUID導致的BUG及解決方案
  8. docker运行jar包_Jenkins+Docker+Springboot单机版持续集成部署
  9. linux手误rm可能不需要跑路
  10. 基于深度卷积神经网络的玉米病害实时识别检测系统
  11. Python3—元组
  12. maven项目中:java.io.IOException: java.io.FileNotFoundException--- (文件名、目录名或卷标语法不正确。)
  13. 【C语言学习笔记】输出函数puts()
  14. Canvas动画案例演示,含动画猫、变幻线、代码雨等
  15. vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5
  16. 囚徒困境(条件判断)
  17. pe中怎么卸载服务器系统更新,如何卸载win7系统更新用pe装win7
  18. 基于python的自媒体和官媒数据爬取、可视化分析及云词图制作
  19. C++中的system(pause);
  20. 一款可以颠覆做网站方式的软件

热门文章

  1. 从150kHz 到 150MHz漫谈智能车竞赛中的无线导航技术
  2. MIC4451驱动单管MOS,IGBT 测试实验
  3. 使用三防漆来保护PCB的敷铜面
  4. 内网虚拟服务器怎么固定域名,如何让自己的局域网用(虚拟的)域名访问?
  5. php变量定义的位置,php变量一般放在哪个位置
  6. linux脚本重定向到输入,linux shell输入输出重定向
  7. mysql 主被切换_mysql 主从切换
  8. c语言中throw的用法,C中的内联throw()方法
  9. led灯光衰怎么解决_车灯不亮怎么办?成都车灯改装店为您带来科学合理车灯升级方案...
  10. 二级c语言编程题只要得出答案,计算机二级C语言考试编程题题库答案.docx