【编程之美】2.1求二进制中1的个数
题目: 对于一个字节的无符号整数变量,求其中的二进制表示中1的个数,要求算法执行效率尽可能高效。 题目解析: 这道题同样在【剑指offer】面试题10:二进制中1的个数中出现,不过在剑指offer中没有提到无符号数,因此比该题目中多考虑一个层次。下面总结这
题目:
对于一个字节的无符号整数变量,求其中的二进制表示中1的个数,要求算法执行效率尽可能高效。
题目解析:
这道题同样在【剑指offer】面试题10:二进制中1的个数 中出现,不过在剑指offer中没有提到无符号数,因此比该题目中多考虑一个层次。下面总结这道题的几种解法。
解法一(用于该题目):
我们通常会想到除以2就是将二进制右移一位,但要判断移除的是0还是1,就要对2取余。思路很简单,通过四则运算来解答:
int Count(Byte v) { int num = 0; while(v){ if(v%2) num++; v /= 2; } return num; }
解法二(用于该题目):
对于除以2来表示二进制右移,除法的效率比直接移位的效率低得多。碰到这样的题目,尽量用移位来代替。位运算就五种形式:与、或、异或、左移和右移。在这些范围里面找到自己想要的运算。移位时要判断移除的是0还是1,那么这里就应该通过与操作判断最后一位是否为1。
int Count2(Byte v) { int num = 0; while(v){ if(v & 1) num++; //也可以用 num += v&1; 来代替上面两行 v = v >> 1; } return num; }
解法三(可以用于有符号数):
如果这个题目是有符号的话,当右移的时候,会在高位补充符号位,用上面两种方法的话,会陷入死循环。如何避免?可以先判断最高位,然后遍历n-1次判断除了最高位以外的位是否为1。这样的方法比较麻烦。我们可以变通一个思路,让与的那一位1不断的左移,直到将1移到最高位。
int Count3(Byte v) { int num = 0; int flag = 1; while(flag){ if(v & flag) ++num; flag = flag << 1; } return num; }
解法四(更加高效的算法):
这种方法,充分利用了二进制的相关操作,平时应该多收集这样的运算。
一个数不为0,那么二进制中肯定含1。当让这个数减去1时,最低位的1由1->0,更低位的0由0->1。当让n与n-1相与以后,n中最低位的1变成0。一次这样的操作,消去一个1,那么二进制中有多少个1,就循环多少次即可。 解法五(空间换时间方法): 其实方法四已经够好了,但是因为只涉及到八位,我们可以利用选择直接选取相应的数据。比如0x1-0x2-0x4...这些都包含1个1;0x3-0x6...包含两个1;等等。通过switch语句选择相应的结果。但是这种方法效率可能比较低,因为,当输入v为255的时候,得比较到最后才能找到相应的数据。 既然想到了利用空间换时间,我们干脆用个数组来表示,index为要查找的数,counttable[index]为该数据包含1的个数。
int Count4(Byte v)
{
int num = 0;
while(v){
++num;
v = v & (v-1);
}
return num;
}
int Count5(Byte v)
{
int num = 0;
switch(v){
case 0x0:
num = 0;
break;
case 0x1:
case 0x2:
....
}
return num;
}
解法六(哈希表法):

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题











使用正则表达式从PHP数组中去除重复值的方法:使用正则表达式/(.*)(.+)/i匹配并替换重复项。遍历数组元素,使用preg_match检查匹配情况。如果匹配,跳过值;否则,将其添加到无重复值的新数组中。

1、编程可以用于开发各种软件和应用程序,包括网站、手机应用、游戏和数据分析工具等。它的应用领域非常广泛,覆盖了几乎所有行业,包括科学研究、医疗保健、金融、教育、娱乐等。2、学习编程可以帮助我们提高问题解决能力和逻辑思维能力。编程过程中,我们需要分析和理解问题,找出解决方案,并将其转化为代码。这种思维方式能够培养我们的分析和抽象能力,提高我们解决实际问题的能力。

Python 使初学者能够解决问题。其用户友好的语法、广泛的库以及变量、条件语句和循环等功能可实现高效的代码开发。从管理数据到控制程序流程和执行重复任务,Python 提供了

本站5月8日消息,TikTok本周二向美国联邦法院提起诉讼,挑战拜登政府剥离法案,要求美国法院阻止实施该法案。TikTok本周二提交了诉讼文件,称国会“采取了史无前例的措施,明确挑出并禁止TikTok”,并称此举“违宪”。据报道,贝克曼表示,如果别离法案正式生效,TikTok将向法院提出反击。贝克曼表示,“不卖就禁”的法律“明显侵犯”了TikTok1.7亿美国用户的宪法第一修正案权利,并将对平台上的700万小企业产生“毁灭性后果”。他还称,“这是漫长过程的开始,而不是结束”,并“继续抗争”。相关

C++编程谜题涵盖斐波那契数列、阶乘、汉明距离、数组最大值和最小值等算法和数据结构概念,通过解决这些谜题,可以巩固C++知识,提升算法理解和编程技巧。

提到区块链速度,最直观的比较就是每秒交易量。以太坊是当下知名度最高的的区块链之一,其交易量也非常多,它是一种基于区块链技术的去中心化计算平台,它允许开发者构建和部署智能合约和去中心化应用(DApps),并提供了一个安全、透明、不可篡改的计算环境。而在前不久数据公布SOL链是最快的,那么以太坊一个区块多少笔交易?引起了投资者的好奇,根据最新数据,以太坊一个区块每秒大概23个交易。下面小编为大家详细说说。以太坊一个区块多少笔交易?根据最新数据,以太坊一个区块每秒大概23个交易,但一个以太坊区块中包含

Python通过其易学性和强大功能,是初学者的理想编程入门语言。其基础包括:变量:用于存储数据(数字、字符串、列表等)。数据类型:定义变量中数据的类型(整数、浮点数等)。运算符:用于数学运算和比较。控制流:控制代码执行流(条件语句、循环)。

C语言是初学者学习编程的理想选择,其优势包括效率、多功能性和可移植性。学习C语言需要:安装C编译器(如MinGW或Cygwin)了解变量、数据类型、条件语句和循环语句编写包含主函数和printf()函数的第一个程序通过实战案例(如计算平均数)练习C语言知识
