判断32位整数二进制中1的个数
在面试中被问到这一题:判断32位无符号整数二进制中1的个数,虽然不难,但要求层层优化。现在整理一下:
1、基本思路:
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大小供查询的表:
int findone(unsigned int n){
for(int i=0;n>0;n>>=8)
i+=tOne[n&255];
return i;
}
3、据说Intel中有条汇编指令(或是数条)即可完成这个工作,但不知道具体是什么,应该怎样做。
4、又看到有道MS的笔试题殊途同归:
int count=0;
while(n>0){
n&=(n-1);
count++;
}
return count;
}
判断32位整数二进制中1的个数相关推荐
- 整数二进制中1的个数
要统计一个整数二进制中1的个数,首先我们会想到最简单的方法就是 % 2 再 / 2,然后判断每一位是否为1. 但是,如果这是一个很大的数,频繁的除法运算效率不是很高.而位运算比乘除法效率高,所以我们就 ...
- 【day15】每日强训编程题——查找输入整数二进制中1的个数手套
查找输入整数二进制中1的个数_牛客题霸_牛客网 这道题非常简单,就一个思路: 按位与& 任何一个数按位与上1,如果这个数二进制的最后一位是1,那么按位与的结果就是1,否则就是0 代码思路:n按 ...
- 【华为机试题 HJHJ62】查找输入整数二进制中1的个数
HJ62 查找输入整数二进制中1的个数 一.题目描述 二.参考代码1 三.参考代码2 一.题目描述 输入一个正整数,计算它在二进制下的1的个数. 注意多组输入输出!!!!!! 二.参考代码1 位运算; ...
- 华为机试HJ62:查找输入整数二进制中1的个数
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个正整数,计算它在二进制下的1的个数. 注意多组输入输出!!!!!! 输入描述 ...
- 05-04 求负数二进制中1的个数
# 求整数二进制中1的个数? # 若整数为整数,直接求二进制,将其转为str遍历判断是否1, # 若为负数,求其补码,再解题, 问:整数二进制指的补码还是原码?def count1(n):print( ...
- C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)
题目: 实现一个函数,输入一个整数,输出该数二进制中1的个数.例如把9表示成二进制是1001,有2位是1,因此如果输入是9,该函数输出2 第一种解法(死循环) 判断整数二进制表示中最右边的一位是不是1 ...
- C/C++求一个整数的二进制中1的个数
求一个整数的二进制中1的个数 收藏 题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析:这是一道很基本的考查位运算的面试题.包 ...
- Java 数值的二进制中1的个数和整数次方
1. 数值的二进制中1的个数 1.1 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 1.2 解题思路 思路一:直接使用java自带的函数Integer.toBinaryS ...
- 剑指 Offer 15. 二进制中1的个数 + 191. 位1的个数(n(n-1)实例)
一.题目:剑指 Offer 15. 二进制中1的个数 请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此, ...
最新文章
- Swift3.0语言教程使用路径字符串
- conrtex 和 ARM 的关系
- 【学习笔记】JS进阶语法一window对象
- 从listView1中选择记录到listView2中
- 什么时候需要好教材和好教材是怎样的
- Virtual DOM(虚拟dom-2)
- mysql char(36)_MySQL中char(36)被認為是GUID導致的BUG及解決方案
- docker运行jar包_Jenkins+Docker+Springboot单机版持续集成部署
- linux手误rm可能不需要跑路
- 基于深度卷积神经网络的玉米病害实时识别检测系统
- Python3—元组
- maven项目中:java.io.IOException: java.io.FileNotFoundException--- (文件名、目录名或卷标语法不正确。)
- 【C语言学习笔记】输出函数puts()
- Canvas动画案例演示,含动画猫、变幻线、代码雨等
- vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5
- 囚徒困境(条件判断)
- pe中怎么卸载服务器系统更新,如何卸载win7系统更新用pe装win7
- 基于python的自媒体和官媒数据爬取、可视化分析及云词图制作
- C++中的system(pause);
- 一款可以颠覆做网站方式的软件
热门文章
- 从150kHz 到 150MHz漫谈智能车竞赛中的无线导航技术
- MIC4451驱动单管MOS,IGBT 测试实验
- 使用三防漆来保护PCB的敷铜面
- 内网虚拟服务器怎么固定域名,如何让自己的局域网用(虚拟的)域名访问?
- php变量定义的位置,php变量一般放在哪个位置
- linux脚本重定向到输入,linux shell输入输出重定向
- mysql 主被切换_mysql 主从切换
- c语言中throw的用法,C中的内联throw()方法
- led灯光衰怎么解决_车灯不亮怎么办?成都车灯改装店为您带来科学合理车灯升级方案...
- 二级c语言编程题只要得出答案,计算机二级C语言考试编程题题库答案.docx