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

题目:

实现一个函数,输入一个整数,输出该数二进制中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、不能用除法来代替移位,因为除法的效率比移位运算要低得多,应该多用移位来代替除法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经验收藏

http://hi.baidu.com/%D7%DF_%B4%F8%C4%E3%CC%FD%B8%E8%C8%A5/blog转载于:https://www.cnblogs.com/hx214blog/archive/2012/05/23/2514796.html

2018智能音频报告:智能音箱带来的智能音频和广播媒体的机遇

来源&#xff1a;199IT互联网数据中心摘要&#xff1a;前中国智能音箱正热&#xff0c;阿里巴巴、京东、百度纷纷发布自己的智能音箱产品&#xff0c;大打价格战&#xff0c;希望以绝对底价抢占市场。前中国智能音箱正热&#xff0c;阿里巴巴、京东、百度纷纷发布自己的智能音箱…

删除链表中指定节点,要求时间复杂度为O(1)

思路&#xff1a; &#xff08;1&#xff09;把要删除的节点的值与其next交换 &#xff08;2&#xff09;删除其next &#xff08;3&#xff09;完成 算法&#xff1a; 1 void DeleteNode(LinkList *p){2 if(p->nextNULL){3 free(p);4 pNULL;5 }…

c++中求前n项和(这代码不得不让我佩服)

今天在牛客网上刷题&#xff0c;遇到了这道题&#xff0c;最后我看到一位大佬的代码让我感觉的还差很多&#xff01;&#xff01;&#xff01; 题目 求123…n&#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&am…

基于Arduino和HC-SR04的超声波测距系统设计

本文介绍了如何使用Arduino和HC-SR04超声波传感器设计并构建一个简单的超声波测距系统。我们将详细讨论硬件连线和编程步骤&#xff0c;并提供完整的Arduino代码。此系统可以应用于各种需要测量距离的项目&#xff0c;例如智能车辆、机器人和安防系统。 引言&#xff1a; 超声…

中国AI企业吸金旺但90%亏损 今年将迎倒闭潮

来源&#xff1a;网易智能摘要&#xff1a; 据报道&#xff0c;自2017年人工智能成为国家战略目标后&#xff0c;相关产业迎来飞速发展机遇&#xff0c;更成为全球吸金能力最强的产业之一。2017全年&#xff0c;大陆AI企业的融资总额已占到全球的7成&#xff0c;但其背后的隐忧…

在窗口间移动按扭

// 在窗口间移动按扭 procedure TForm1.Button1Click(Sender: TObject);begin if Button1.ParentForm1 then begin button1.Caption:单击返回; Button1.Parent:Form2; Button1.Left : 232; Button1.Top : 88; end else begin …

不用加减乘除算加法

题目 写一个函数&#xff0c;求两个整数之和&#xff0c;要求在函数体内不得使用、-、*、/四则运算符号。 思路 &#xff08;一&#xff09;首先看我们平时的十进制是如何做的&#xff1a; 65 &#xff0c;三步曲&#xff01;&#xff01;&#xff01; 相加各位的值&#xf…

《Nature》纪念人工智能60周年专题:深度学习综述

来源&#xff1a;网络大数据摘要&#xff1a;本文是《Nature》杂志为纪念人工智能60周年而专门推出的深度学习综述&#xff0c;也是Hinton、LeCun和Bengio三位大神首次合写同一篇文章。本文是《Nature》杂志为纪念人工智能60周年而专门推出的深度学习综述&#xff0c;也是Hinto…

oss/bss/mss转自搜搜百科

BSS:Business support system 业务支撑系统 OSS:Operation support system 运营支撑系统 MSS:Management Support System 管理支撑系统 (前二者又合称 BOSS:Business and Operation support system ,电信业务运营支持系统)在 企业(特别在是电信行业)IT 战略规划中占据了重要地…

模拟实现string其中的一些知识点

知识点列举 使用初始化列表的好处拷贝构造的形参为&与值的区别深拷贝与浅拷贝使用&的好处形参使用const引用的好处 使用初始化列表的好处 类成员中存在常量&#xff0c;如const int a,只能用初始化不能复制类成员中存在引用&#xff0c;同样只能使用初始化不能赋值。…

对抗性攻击轻松愚弄人工智能

对抗性攻击欺骗图像识别算法将3D打印乌龟认作步枪。来源&#xff1a;中国科学报摘要&#xff1a;在日前于瑞典斯德哥尔摩举行的国际机器学习会议上&#xff0c;一群研究人员描述了他们的3D打印乌龟。在日前于瑞典斯德哥尔摩举行的国际机器学习会议上&#xff0c;一群研究人员描…

浅谈C语言指针

什么是指针&#xff1f; 在计算机科学中&#xff0c;指针&#xff08;Pointer&#xff09;是编程语言中的一个对象&#xff0c;利用地址&#xff0c;它的值直接指向存在电脑存储器中的另一个地方的值。由于通过地址能找到所需的变量单位&#xff0c;可以说&#xff0c;地址指向…

转:EXCEL数据有效性设置

原文&#xff1a; http://hi.baidu.com/guosq/blog/item/88b37cd5bd367cfda144dfa0.html 先看图&#xff0c;有学生成绩表格&#xff0c;录入要求&#xff1a; 1. 成绩范围&#xff1a; 0 - 100&#xff1b; 2. 课程&#xff1a;只能是语文、数学、英语。 操作步骤&#xff1a;…

科学家绘制果蝇完整大脑高清图—可借此追踪任何两个神经元之间的连接

研究人员利用电子显微镜重建了果蝇的一系列神经元。来源&#xff1a;中国科学报科学家近日首次对黑腹果蝇的整个大脑进行了足够详细的成像&#xff0c;从而能探测每个神经元之间的单独连接&#xff0c;或者说突触。由此获得的图像数据库可帮助研究人员描绘支撑果蝇嗅闻、嗡嗡叫…

浅谈野指针

什么是野指针&#xff1f; 野指针并不是NULL指针&#xff0c;它是一个指向“垃圾”内存的指针&#xff0c;也就是说指向的地址是随机的&#xff0c;无法得知他的地址&#xff0c;操作系统自动对其进行初始化。   在计算机中&#xff0c;内存的分配由操作系统来管理&#xff0…

转: Linux下单网卡多vlan多虚拟机

#启动xen服务&#xff1a;xend start#列出虚拟机xm list#startxm create -c 虚拟机名#进入虚拟机xm console 虚拟机名#退出虚拟机ctrl]#关闭xm shutdown linux bridge实现了ieee 802.1d协议&#xff0c;这个实现&#xff0c;不能支持VLAN的功能。也就是说&#xff0c;这个实现&…

谈谈 Android 有多成功!欧盟这么罚它

选自 | Stratechery 作者 | Ben Thompson 编译 | 网易智能 参与 | 乐邦西方知名科技博主本汤普森&#xff08;Ben Thompson&#xff09;近日发布题为“欧盟VS Android”的文章&#xff0c;称谷歌固然有其违法的地方&#xff0c;但欧盟剥夺谷歌从其冒着高风险斥资数十亿美元开发…

VSS 错误链接

VSS服务器没有开&#xff08;或者链接不上、共享断开等情况&#xff09;&#xff0c;vs工程打开会提示你找不到VSS数据库&#xff0c;不小心点错了位置&#xff0c;结果VS链接不上VSS了&#xff0c;老是提示如下错误&#xff1a;VSS出项错误"Could not find the Visual So…

算法的五大特性

输入&#xff08;Input&#xff09; 算法可以有0个或多个输入&#xff0c;用来说明对象的初始值&#xff0c;其中的0的输入的意思是指算法自己已经定出了初始条件 输出&#xff08;Output&#xff09; 算法中必须有1或多个输出&#xff0c;因为输出是用来说明数据处理后的结果…