C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)
题目:
实现一个函数,输入一个整数,输出该数二进制中1的个数。例如把9表示成二进制是1001,有2位是1,因此如果输入是9,该函数输出2
第一种解法(死循环)
- 判断整数二进制表示中最右边的一位是不是1
- 将二进制数右移一位¹
- 直到整个整数变成0为止
代码如下:
int NumberOf1(int n)
{ int count = 0; while(n){ if(n & 1) count++; n = n >> 1; } return count;}
这样很容易造成死循环,如果输入是一个负数,将负数想右移一位的时候,并不是简单的将最高位1移到第二位,而是移位后最高位任然回事1,因为右移前是一个负数,右移后仍要保持是负数,一直持续下去数字就会变成0xFFFFFFFF而陷入死循环
第二种解法(常规)
为了避免死循环,可以不移动输入的数字,移动一个无符号的变量1
- 定义一个无符号的临时变量tmp = 1
- 将输入的数字与tmp做位与运算,判断最低位是不是1
- 将tmp左移一位,再次将输入的数字与tmp做位与运算,判断次低位是不是1
- 将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,直到这个整数为零
代码如下:
int NumberOf2(int n){ int count = 0;while (n){n = n&(n - 1);count++;}return count;}
这种解法可以有效的避免死循环和效率低,例如1101,具体实现过程如下
注:1、不能用除法来代替移位,因为除法的效率比移位运算要低得多,应该多用移位来代替除法
C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)相关推荐
- C/C++求一个整数的二进制中1的个数
求一个整数的二进制中1的个数 收藏 题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析:这是一道很基本的考查位运算的面试题.包 ...
- 说一说,求一个正整数的二进制中0的个数
昨天突然看到一个算法题:一个正整数a的二进制中0的个数: 话说这是个老题了,直观的算法就每次右移一位,直到0为止:代码就省略了: 仔细想想有更好的方案么? 就是这个题可以转换成一个正整数~a的二进制中 ...
- 写一个参数返回二进制中1的个数
#include<stdio.h> int main() { int num; int s=0,yus=0,count=0; printf("请输入一个数字:" ...
- 统计二进制中1的个数(四种方案)
方案一:(只适合计算正数) #include<stdio.h> #include<stdlib.h> int main() { int num = 10; //10的二进制数 ...
- 整数二进制中1的个数
要统计一个整数二进制中1的个数,首先我们会想到最简单的方法就是 % 2 再 / 2,然后判断每一位是否为1. 但是,如果这是一个很大的数,频繁的除法运算效率不是很高.而位运算比乘除法效率高,所以我们就 ...
- 《剑指offer》c++版本 15.二进制中1的个数
如题: 平常开发过程中,遇到求数的每位数字的时候,通常做法是将这个逐位右移,本题目计算整数的二进制中1的个数,通过右移的方式,能够解决部分问题,但是,这里有个坑,如果整数为负的话,右移后最左边还是1, ...
- 第2章 数字之魅——求二进制中1的个数
求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二 ...
- Java 数值的二进制中1的个数和整数次方
1. 数值的二进制中1的个数 1.1 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 1.2 解题思路 思路一:直接使用java自带的函数Integer.toBinaryS ...
- 【day15】每日强训编程题——查找输入整数二进制中1的个数手套
查找输入整数二进制中1的个数_牛客题霸_牛客网 这道题非常简单,就一个思路: 按位与& 任何一个数按位与上1,如果这个数二进制的最后一位是1,那么按位与的结果就是1,否则就是0 代码思路:n按 ...
最新文章
- 9.8.6恢复系统数据库
- 【转载】Unix编程艺术——Unix哲学
- python玩装虎牙直播自动登录发弹幕
- 递归三:变态蛙跳台阶
- RBF:RBF基于近红外光谱的汽油辛烷值含量预测结果对比
- ElasticSearch学习资料
- 电路宽度测量halcon例子
- java判断时间是否在时间段内_具有C语言基础,利用半年时间学习Java是否够用
- 好久不更新这个博客了。
- datareader对象直接转化为int_Integer、new Integer() 和 int 比较的面试题
- 【HDU - 1518】Square (经典的dfs + 剪枝)
- 15拆分成3个不同的自然数_17个数学重点知识点汇总,一篇搞定小升初
- python交通流预测代码_使用ARIMA模型进行的短时交通流预测和结果分析
- Latex的空格 转载
- windows-sock-简单例子-转
- 蓝桥杯2013c++真题:颠倒的价牌
- scala 函数中嵌套函数_Scala函数–声明,定义,调用和嵌套函数
- Linux进程线程学习笔记
- 华硕服务器安装系统安装教程,华硕u盘安装系统教程
- Swift3.0知识点:高度模仿斗鱼TV(一)