首页 数据库 mysql教程 【编程之美】2.1求二进制中1的个数

【编程之美】2.1求二进制中1的个数

Jun 07, 2016 pm 03:15 PM
个数 二进制 字节 编程

题目: 对于一个字节的无符号整数变量,求其中的二进制表示中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,就循环多少次即可。

int Count4(Byte v)
{
    int num = 0;
    while(v){
        ++num;
        v = v & (v-1);
    }
    return num;
}
登录后复制


解法五(空间换时间方法):

其实方法四已经够好了,但是因为只涉及到八位,我们可以利用选择直接选取相应的数据。比如0x1-0x2-0x4...这些都包含1个1;0x3-0x6...包含两个1;等等。通过switch语句选择相应的结果。但是这种方法效率可能比较低,因为,当输入v为255的时候,得比较到最后才能找到相应的数据。

int Count5(Byte v)
{
    int num = 0;
    switch(v){
    case 0x0:
        num = 0;
        break;
    case 0x1:
    case 0x2:
        ....
    }

    return num;
}
登录后复制

解法六(哈希表法):

既然想到了利用空间换时间,我们干脆用个数组来表示,index为要查找的数,counttable[index]为该数据包含1的个数。








本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

使用正则表达式去除 PHP 数组中的重复值 使用正则表达式去除 PHP 数组中的重复值 Apr 26, 2024 pm 04:33 PM

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

编程是干啥的,学了有什么用 编程是干啥的,学了有什么用 Apr 28, 2024 pm 01:34 PM

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

使用 Python 解决问题:作为初学者,解锁强大的解决方案 使用 Python 解决问题:作为初学者,解锁强大的解决方案 Oct 11, 2024 pm 08:58 PM

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

TikTok 起诉挑战拜登政府剥离法案:'不卖就禁”违反美国宪法第一修正案 TikTok 起诉挑战拜登政府剥离法案:'不卖就禁”违反美国宪法第一修正案 May 08, 2024 pm 02:01 PM

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

C++ 编程谜题集锦:激发思维,提升编程水平 C++ 编程谜题集锦:激发思维,提升编程水平 Jun 01, 2024 pm 10:26 PM

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

以太坊一个区块多少笔交易?占多少字节? 以太坊一个区块多少笔交易?占多少字节? Jun 10, 2024 pm 10:15 PM

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

编码的关键:为初学者释放 Python 的力量 编码的关键:为初学者释放 Python 的力量 Oct 11, 2024 pm 12:17 PM

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

释放你内心的程序员:C 绝对初学者 释放你内心的程序员:C 绝对初学者 Oct 11, 2024 pm 03:50 PM

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

See all articles