博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
整数的转换成2进制有多少个1
阅读量:6172 次
发布时间:2019-06-21

本文共 1686 字,大约阅读时间需要 5 分钟。

转载来自:

题目:输入一个整数,判断该正数的二进制表示中有多少个1?例如:输入整数12,转换成二进制是1100,共有2个1,因而应该输出2.

 

  分析1:我们可以这样考虑,从右向左注意判断每一个位上是否为1,怎么判断?我们让这个数和整数1(01)做与运算,由于1除最后一位外其余部分全部都是0,因而如果整数的最后一位是1,则返回结果为1,如果整数的最后1为是0,则返回结果为0;接着,我们让该整数与2(10)做与运算,我们就可以判断整数的倒数第二位是否是1;再下来,我们让该整数与4(100)做与运算,判断倒数第三位是否为1;以此类推,我们就可以判断出整数的所有1的个数,而与整数做与运算的数分别为1,2,4,8......我们可以让1做左移1位的运算得到。基于这种思路我们可以得到如下的代码:

1 #include
2 #include
3 using namespace std; 4 5 int NumbersOf1s(int number) 6 {
7 int cnt = 0; 8 unsigned int flag = 1; 9 while(flag) 10 {
11 if(flag&number) 12 cnt++; 13 14 flag = flag<<1; 15 } 16 return cnt; 17 } 18 19 int main() 20 {
21 cout<<"Enter A Number:"<
>i; 24 cout<<"the numbers of 1s in your number is:" 25 <
<

运行结果如下:

  分析2:如果一个整数不为0,那么它的二进制形式至少有一位是1,如果我们将一个二进制数减去1,那么这个二进制数的最右边的1将会变成0,而这个1后面的0都会变成1.以1100为例,最右边的1是右数第三位,这个数减去1之后变成1011。如果我们把得到的这个数和原数进行与运算,那么右边第一个1及之后的数都为0,即1100&1011==1000,也就是说,我们把一个数减去1后与原数做与运算将会消去最右边的一个1,有多少个1,我们就做多少次类似的循环即可。基于这有思路我们有如下的代码:

1 #include
2 #include
3 using namespace std; 4 5 int NumbersOf1s(int number) 6 {
7 int cnt = 0; 8 while(number) 9 {
10 cnt++; 11 number = number & (number - 1); 12 } 13 14 return cnt; 15 } 16 17 int main() 18 {
19 cout<<"Enter A Number:"<
>i; 22 cout<<"The Numbers of 1s in your number is:" 23 <
<

运行结果如下:

  

关于移位运算和乘除运算:在分析1中,我们说可以对一个1不断一位运算得到十进制中的1,2,4,8,16等等,有同学可能会说,我们为什么不对flag做×2的运算呢?因为移位运算的效率要远高于乘除运算,不光是本题,在其他的编程中,我们也应该尽量用移位运算代替乘除运算。

你可能感兴趣的文章
jQuery的入口函数
查看>>
Java基础班学习笔记(5)
查看>>
mongodb的学习-3-在Mac上的安装配置
查看>>
学习函数调用的约定方式
查看>>
ACM题解系列之二:刘汝佳:《算法竞赛入门经典训练指南》
查看>>
HDU1262 寻找素数对
查看>>
HDU2009 求数列的和
查看>>
log4cplus使用(二)-自定义日志等级
查看>>
Android中使用webservice验证用户登录的示例
查看>>
log4j.properties配置说明学习网址
查看>>
堆排序
查看>>
[Codeforces Round #284 (Div. 1) B]Name That Tune(概率Dp)
查看>>
每天一个linux命令(2):cd命令
查看>>
Debian/Ubuntu下GPT分区转MBR分区
查看>>
[教程]图文:python安装+psutil模块安装
查看>>
写出这个数 (20)
查看>>
10个常用方法有效优化ASP.NET的性能
查看>>
Sublime Text 3常用插件—Emmet
查看>>
Css远程字体 font-face
查看>>
plsql基础教程(自学用)
查看>>