求一个字节中,1/0的个数

对于一个字节(8bit)的变量,求二进制表示中"1”的个数,要求算法的执行效率尽可能的高 题目中要求执行效率要尽可能的高,我只想到了将除法改为位运算符来实现,还有很多没有考虑的地方。 下面通过几个程序来看这个问题: 1.最简单的程序 #include using namespace std; int main() { unsigned char b_num; int i_count=0; cout<<"请输入一个1~256之间的整数"<<endl; 阅读详情

 

真是很极端的做法啊

宋宝华 21cnbao@21cn.com 软件报
问题:对于一个字节(8bit)的数据,求其中“1”的个数,要求算法的执行效率尽可能地高。
分析:作为一道著名外企的面试题,看似简单,实则可以看出一个程序员的基本功底的扎实程度。你或许已经
想到很多方法,譬如除、余操作,位操作等,但都不是最快的。本文一步步分析,直到最后给出一个最快的方
法,相信你看到本文最后的那个最快的方法时会有惊诧的感觉。
解答:
首先,很自然的,你想到除法和求余运算,并给出了如下的答案:
方法1:使用除、余操作

#include
#define BYTE unsigned char
int main(int argc, char *argv[])
{
int i, num = 0;
BYTE a;
/* 接收用户输入 */
printf("/nPlease Input a BYTE(0~255):");
scanf("%d", &a);
/* 计算1 的个数 */
for (i = 0; i < 8; i++)
{
if (a % 2 == 1)
{
num++;
}
a = a / 2;
}
printf("/nthe num of 1 in the BYTE is %d", num);
return 0;
}
很遗憾,众所周知,除法操作的运算速率实在是很低的,这个答案只能意味着面试者被淘汰!
好,精明的面试者想到了以位操作代替除法和求余操作,并给出如下答案:
方法2:使用位操作
#include
#define BYTE unsigned char
int main(int argc, char *argv[])
{
int i, num = 0;
BYTE a;
/* 接收用户输入 */
printf("/nPlease Input a BYTE(0~255):");
scanf("%d", &a);
/* 计算1 的个数 */
for (i = 0; i < 8; i++)
{
num += (a >> i) &0x01;
}
/*或者这样计算1 的个数:*/
/* for(i=0;i<8;i++)
{
if((a>>i)&0x01)
num++;
}*/
printf("/nthe num of 1 in the BYTE is %d", num);
return 0;
}
方法二中num += (a >> i) &0x01;操作的执行效率明显高于方法一中的
if (a % 2 == 1)
{
num++;
}
a = a / 2;
到这个时候,面试者有被录用的可能性了,但是,难道最快的就是这个方法了吗?没有更快的了吗?方法二真
的高山仰止了吗?
能不能不用做除法、位操作就直接得出答案的呢?于是你想到把0~255 的情况都罗列出来,并使用分支操作,
给出如下答案:
方法3:使用分支操作
#include
#define BYTE unsigned char
int main(int argc, char *argv[])
{
int i, num = 0;
BYTE a;
/* 接收用户输入 */
printf("/nPlease Input a BYTE(0~255):");
scanf("%d", &a);
/* 计算1 的个数 */
switch (a)
{
case 0x0:
num = 0;
break;
case 0x1:
case 0x2:
case 0x4:
case 0x8:
case 0x10:
case 0x20:
case 0x40:
case 0x80:
num = 1;
break;
case 0x3:
case 0x6:
case 0xc:
case 0x18:

case 0x30:
case 0x60:
case 0xc0:
num = 2;
break;
//...
}
printf("/nthe num of 1 in the BYTE is %d", num);
return 0;
}
方法三看似很直接,实际执行效率可能还会小于方法二,因为分支语句的执行情况要看具体字节的值,如果a=0,
那自然在第1 个case 就得出了答案,但是如果a=255,则要在最后一个case 才得出答案,即在进行了255
次比较操作之后!
看来方法三不可取!但是方法三提供了一个思路,就是罗列并直接给出值,离最后的方法四只有一步之遥。眼
看着就要被这家著名外企录用,此时此刻,绝不对放弃寻找更快的方法。
终于,灵感一现,得到方法四,一个令你心潮澎湃的答案,快地令人咋舌,算法中不需要进行任何的运算。你
有足够的信心了,把下面的答案递给面试官:
方法4:直接得到结果
#include
#define BYTE unsigned char
/* 定义查找表 */
BYTE numTable[256] =
{
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3,
3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3,
4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,
3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3,
4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6,
6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4,
5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3,
4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4,
4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6,
7, 6, 7, 7, 8
};
int main(int argc, char *argv[])
{
int i, num = 0;
BYTE a = 0;
/* 接收用户输入 */
printf("/nPlease Input a BYTE(0~255):");
scanf("%d", &a);
/* 计算1 的个数 */
/* 用BYTE 直接作为数组的下标取出1 的个数,妙哉! */

printf("/nthe num of 1 in the BYTE is %d", checknum[a]);
return 0;
}
这是个典型的空间换时间算法,把0~255 中1 的个数直接存储在数组中,字节a 作为数组的下标,checknum[a]
直接就是a 中“1”的个数!算法的复杂度如下:
时间复杂度:O(1)
空间复杂度:O(2n)
恭喜你,你已经被这家著名的外企录用!老总向你伸出手,说:“Welcome to our company”

不知道嵌入式那点内存是否允许鼓励这样做。

 

 

求二进制中1的个数 阅读详情

相关推荐

求二进制数中1的个数(编程之美)

求二进制数中1的个数继京东618店庆时买的《编程之美》这本书,翻了翻,发现里面的题还是挺有意思的,看起来我们觉得很简单的题目,解法却有很多很多种,真是一个比一个巧妙,于是,决定记录一下。书中的题目如下 对于一个字节(8bit)的无符号数,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高。

wojiushimogui的博客 2467

求二进制数中1的个数

 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高。分析与解法大多数的读者都会有这样的反应:这个题目也太简单了吧,解法似乎也相当地单一,不会有太多的曲折分析或者峰回路转之处。那么面试者到底能用这个题目考察我们什么呢?事实上,在编写程序的过程中,根据实际应用的不同,对存储空间或效率的要求也不一样。比如在PC上的程序编写与在嵌入式设备上的程序编写就有很

lyy learn C 530

求二进制数中1的个数.pdf

对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效 率尽可能地高。

常见面试算法题:统计一个Byte中的“1”的个数

题目描述:对于一个字节(8bit)的无符号整形变量,求二进制表示中“1”的个数,要求算法执行效率尽可能地高 java中有三种移位运算符 &lt;&lt; : 左移运算符,num &lt;&lt; 1,相当于num乘以2 &gt;&gt; : 右移运算符,num &gt;&gt; 1,相当于num除以2 &gt;&gt;&gt; : 无符号右移,...

建设美丽祖国 5666

S7-200SMART中位状态的变址读写以及统计字节中为1或0的数量.rar

S7-200SMART中位状态的变址读取和写入以及统计N个字节中为1或为0的数量 1,位的变址读取 2,位的变址写入 3,N个字节中=1或=0的位的统计

群晖NAS从入门到精通的所有帖子汇总,只要这一篇就够了

本站陆陆续续的转载、原创帖子也有十几二十篇了,从不同的角度对群晖NAS的各种骚操作都有深入的讲解,虽然很多文章都不是讲的很深入,但是针对小白入门已经是足够了,希望对小白来说是一个入门,群晖NAS的大佬们勿喷,哪里写的不对的,请随时留言西安SEO优化站长一定在第一时间纠正修改。

西安SEO优化网站资源 8万+

嵌入式C/C++语言学习记录8(非原创)

一道著名外企面试题的抽丝剥茧问题:对于一个字节( 8bit)的数据,求其中“1”的个数,要求算法的执行效率尽可能地高。方法 1:使用除、余操作方法 2:使用位操作方法 3:使用分支操作方法 4:直接得到结果 问题:对于一个字节( 8bit)的数据,求其中“1”的个数,要求算法的执行效率尽可能地高。 分析:作为一道著名外企的面试题,看似简单,实则可以看出一个程序员的基本功底的扎实程度。你或许已经想到...

qq_35009321的博客 407

树莓派4B学习笔记一

树莓派4b烧录Ubuntu20.04&&配置Ubuntu桌面

m0_55202222的博客 3634

高效计算一个字节中所有的1的个数。

就如何高效计算一个字节中所有的1的个数的问题,本文提了三种方法。

郝伟老师的博客——大数据、并行计算与人工智能时代 2499

ADS中使用Momentum进行电源完整性分析示例

这个应用可以帮助工程师用更快的时间使用ADS Momentum完成PDN分析。该应用描述了利用ADS Momentum RF模拟器进行PDN分析的方法,大大缩短了计算时间。 该分析主要应用与高速数字设计。 在此应用中使用了以下ADS特性: ADS设计流程集成(ADFI)。 电磁协同仿真。 Momentum仿真。 仿真流程如下: 在Allegro中创建ADFI文件 要将Alleg...

zb6075_lb的专栏 7007

图像传感器与信号处理——详解CCD与CMOS图像传感器

一文详解CCD与CMOS图像传感器一文详解CCD与CMOS图像传感器1. 图像传感器性能关键词1.1 噪声1.2 暗电流 一文详解CCD与CMOS图像传感器 本文主要总结了CCD与CMOS传感器的原理知识,参考书籍为《数码相机中图像传感器和信号处理》,英文版为《Image Sensors And Signal Processing for Digital Still Cameras》 1. 图像传...

weixin_44580210的博客 2万+

一个字节中的1的个数

 编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请给出该题至少一个不同解法。void oneofchar(){ unsigned char ch = 0x77; unsigned char temp = 1; int i,j=0; for(i = 0;i {  if((ch & temp) != 0)   j++;  temp = temp  } printf("0x%x/n

ammana_babi的专栏 2209

手把手教你学Simulink——基础电机控制场景实例:基于Simulink的永磁同步发电机温度场耦合仿真

摘要:本文详细介绍了基于Simulink的永磁同步发电机(PMSG)电-热耦合仿真方法。通过Simscape Electrical搭建含热端口的PMSG模型,结合集总参数热网络(LPTN)实现损耗计算与温度反馈,分析了过载工况下温升对电阻和永磁体性能的影响。仿真结果表明:150%过载20秒会导致绕组温升132°C,电阻增加42%,磁链衰减10.5%。文章还提供了自然冷却与强迫风冷的对比数据,并建议通过多物理场耦合仿真预防实机过热问题。该方法可有效支撑高功率密度电机热设计,避免永磁体退磁风险。

MHD0815的博客 250

求1个字节中的‘1’的个数

求1个字节中的‘1’的个数 法1 依次判断每个位。 法2 分而治之。 int count(unsigned char byte) { byte=(byte>>1)&0x55+byte&0x55; byte=(byte>>2)&0x33+byte&0x33; byte=(byte>>4)&0xF+byte&0xF; return (byte|0xFF); } ...

weixin_45090728的博客 779

YOLOv8 改进:使用 MobileNetV3 轻量化架构改进特征提取网络

通过使用 MobileNetV3 作为 YOLOv8 的特征提取器,能够显著降低模型复杂度和运行时资源消耗,同时在一定程度上保持检测精度。这种方法特别适合需要高效计算的边缘设备和嵌入式系统。

走向CTO的路上... 1275

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷1及答案解析)

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷1及答案解析)

王老师青少年编程 2023

统计一个数的二进制表示0和1个数的方法

文章目录统计一个数的二进制表示1的方法统计一个数的二进制表示0的方法 这几天一直在牛客上刷笔试题,遇到了两个题,一个题是怎么用二进制表示0的方法,另一个是怎么用二进制表示1的方法,二话不说先上总结: 统计一个数的二进制表示1的方法 先上代码 int func(int x) { int count = 0; while(x) { count++; x = x&(x-1);//与...

makunIT的博客 3406

把雷达强度特征融合于 Cartographer的实现流程 :从地图构建到在线定位

摘要:本文提出在激光SLAM中融合强度特征的方法,解决几何匹配在退化环境中的失效问题。详细介绍了两种高反地图生成方式:离线使用assets_writer工具处理优化轨迹,在线实时累积高反点;以及权重网格的构建与预计算金字塔方法。定位阶段通过加权得分公式融合几何和强度信息,采用自适应缩放策略平衡特征依赖。该方案在不显著增加计算负担的前提下,有效提升了对称环境等退化场景的定位稳定性,对利用人工路标的移动机器人具有实用价值。

Studying…… 1327

如何求二进制表示中“1”的个数

刚翻开《编程之美》, 中间就有一道我很眼熟的题,“求二进制中1的个数”。书中的题目描述如下:

AllZone 980

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

反转一个字节和判断32位整数二进制中1的个数等算法

  unsigned char reverse8( unsigned char c ){    c = ( c & 0x55 ) > 1;    c = ( c & 0x33 ) > 2;    c = ( c & 0x0F ) > 4;    return c;}unsigned long func(unsigned long x){    x = (x & 0x55555555UL) +

Knocking On The Heaven's Door 3187

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

计算一个字节(8位)里面,1的个数

转载自:https://blog.csdn.net/lirn129/article/details/9300311 编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请给出该题至少一个不同解法。 void oneofchar() {  unsigned char ch = 0x77;  unsigned char temp = 1;  int i,j=0;  for(i = 0;...

feifansong的博客 3073

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

求一个二进制(8bits)中1的个数

对于一个字节(8bits)无符号变量,求其二进制表示中“1”的个数,要求算法执行效率尽可能高 第一眼看着这个题的时候,觉得很简单,就是求二进制中1的数。但是细细品味,又想不到什么好方法,怎么统计呢? 还是看看基础的解法吧。以二进制数10100010为例。 /** * 通过二进制数除以2的方式统计,取模2值为1时,统计数增1 * 反之不加,后再除以2取整部分 *...

Zen@sz 博客 2302
上一篇: 最简单的ARM裸机程序,帮你理解程序的运行启动(mini2440开发板)
下一篇: 理解插入排序法
Coding人生
博客等级 码龄20年 37粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值