题目:

实现一个函数,输入一个整数,输出该数二进制中1的个数。例如把9表示成二进制是1001,有2位是1,因此如果输入是9,该函数输出2

第一种解法(死循环)

  1. 判断整数二进制表示中最右边的一位是不是1
  2. 将二进制数右移一位¹
  3. 直到整个整数变成0为止

代码如下:

int NumberOf1(int n)
{   int count = 0;    while(n){        if(n & 1)           count++;        n = n >> 1;   }    return count;}

这样很容易造成死循环,如果输入是一个负数,将负数想右移一位的时候,并不是简单的将最高位1移到第二位,而是移位后最高位任然回事1,因为右移前是一个负数,右移后仍要保持是负数,一直持续下去数字就会变成0xFFFFFFFF而陷入死循环

第二种解法(常规)

为了避免死循环,可以不移动输入的数字,移动一个无符号的变量1

  1. 定义一个无符号的临时变量tmp = 1
  2. 将输入的数字与tmp做位与运算,判断最低位是不是1
  3. 将tmp左移一位,再次将输入的数字与tmp做位与运算,判断次低位是不是1
  4. 将tmp一直左移,直到最高位

代码如下:

int  NumberOf1(int n){int count = 0;unsigned int tmp = 1;while (tmp){if (n & tmp){count++;}tmp = tmp << 1;}return count;}

这样效率相对低一些,因为这个循环次数等于整数二进制的位数,32位的整数就需要循环32次,浪费不必要的时间

第三种解法(将以上优缺点进行了融合)

为了提高代码的效率,可以将整数减1在与之前的原整数进行位与运算

  1. 将输入的整数减1再与原整数进行位与运算
  2. 将运算结果赋给输入的整数
  3. 一直循环1、2,直到这个整数为零

代码如下:

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

这种解法可以有效的避免死循环和效率低,例如1101,具体实现过程如下


注:1、不能用除法来代替移位,因为除法的效率比移位运算要低得多,应该多用移位来代替除法

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

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

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

  2. 说一说,求一个正整数的二进制中0的个数

    昨天突然看到一个算法题:一个正整数a的二进制中0的个数: 话说这是个老题了,直观的算法就每次右移一位,直到0为止:代码就省略了: 仔细想想有更好的方案么? 就是这个题可以转换成一个正整数~a的二进制中 ...

  3. 写一个参数返回二进制中1的个数

    #include<stdio.h>  int main()  {  int num;  int s=0,yus=0,count=0; printf("请输入一个数字:" ...

  4. 统计二进制中1的个数(四种方案)

    方案一:(只适合计算正数) #include<stdio.h> #include<stdlib.h> int main() { int num = 10;  //10的二进制数 ...

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

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

  6. 《剑指offer》c++版本 15.二进制中1的个数

    如题: 平常开发过程中,遇到求数的每位数字的时候,通常做法是将这个逐位右移,本题目计算整数的二进制中1的个数,通过右移的方式,能够解决部分问题,但是,这里有个坑,如果整数为负的话,右移后最左边还是1, ...

  7. 第2章 数字之魅——求二进制中1的个数

    求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二 ...

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

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

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

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

最新文章

  1. 9.8.6恢复系统数据库
  2. 【转载】Unix编程艺术——Unix哲学
  3. python玩装虎牙直播自动登录发弹幕
  4. 递归三:变态蛙跳台阶
  5. RBF:RBF基于近红外光谱的汽油辛烷值含量预测结果对比
  6. ElasticSearch学习资料
  7. 电路宽度测量halcon例子
  8. java判断时间是否在时间段内_具有C语言基础,利用半年时间学习Java是否够用
  9. 好久不更新这个博客了。
  10. datareader对象直接转化为int_Integer、new Integer() 和 int 比较的面试题
  11. 【HDU - 1518】Square (经典的dfs + 剪枝)
  12. 15拆分成3个不同的自然数_17个数学重点知识点汇总,一篇搞定小升初
  13. python交通流预测代码_使用ARIMA模型进行的短时交通流预测和结果分析
  14. Latex的空格 转载
  15. windows-sock-简单例子-转
  16. 蓝桥杯2013c++真题:颠倒的价牌
  17. scala 函数中嵌套函数_Scala函数–声明,定义,调用和嵌套函数
  18. Linux进程线程学习笔记
  19. 华硕服务器安装系统安装教程,华硕u盘安装系统教程
  20. Swift3.0知识点:高度模仿斗鱼TV(一)

热门文章

  1. 26岁!年入100万,两周把 Github 项目推向全球榜首,他是怎么做的?
  2. Spring Cloud Hoxton正式发布,Spring Boot 2.2 不再孤单
  3. 论文浅尝 | 利用机器翻译和多任务学习进行复杂的知识图谱问答
  4. 论文浅尝 | CoRR - 面向复杂知识问答的框架语义解析方法
  5. :批量制作档案表,要从excel表格中将每个人的数据导入到docx档案
  6. axios网络请求框架源码解析
  7. Mybatis逆向工程的pojo实现序列化接口代码
  8. 特殊乘法(字符串循环的结束标志)
  9. javascript测试框架mocha
  10. 二 jQuery 语法