如何判断一个数二进制中“1”的个数
2017-11-06 21:41
225 查看
在这里我们以数字“7”为例(数字“7”的二进制为“111”,有三个“1”),提供两种方法来判断一个数中二进制中“1”的 个数!
1.使用移位操作符(右移操作)
让二进制的每一位&(逻辑与)1,如果得到的结果为数字“1”,则二进制数该位有一个“1”。
#include<stdio.h>
int main()
{
int num = 7;
int count = 0;
while (num)
{
if (num & 1 == 1)
{
count++;
}
num = num >> 1;
}
printf("num中1的个数有:%d", count);
return 0;
}
2.巧妙运用数字之间的关系(最高效算法)
让我们要计算的数与该数减一的 进行&运算,当计算结果为0时,程序结束。
例如,让7(111)&6(110)得到的是6(110),接着6(110)&5(101)得到4(100),接着4(100)&3(011)得到0(000),程序结束, 得到的结果就是有3个“1”。
#include<stdio.h>
int main()
{
int num = 7;
int count = 0;
while (num)
{
num = num&(num - 1);
count++;
}
printf("num中1的个数:%d\n", count);
return 0;
}上述两个代码的结果都是一样的,运行结果如下:
像这样的问题都是一些比较简单的算法,有时代码看起来很容易,但让自己去想,可能一时半会想不到,这就需要我们多去看书,多去总结和积累!
1.使用移位操作符(右移操作)
让二进制的每一位&(逻辑与)1,如果得到的结果为数字“1”,则二进制数该位有一个“1”。
#include<stdio.h>
int main()
{
int num = 7;
int count = 0;
while (num)
{
if (num & 1 == 1)
{
count++;
}
num = num >> 1;
}
printf("num中1的个数有:%d", count);
return 0;
}
2.巧妙运用数字之间的关系(最高效算法)
让我们要计算的数与该数减一的 进行&运算,当计算结果为0时,程序结束。
例如,让7(111)&6(110)得到的是6(110),接着6(110)&5(101)得到4(100),接着4(100)&3(011)得到0(000),程序结束, 得到的结果就是有3个“1”。
#include<stdio.h>
int main()
{
int num = 7;
int count = 0;
while (num)
{
num = num&(num - 1);
count++;
}
printf("num中1的个数:%d\n", count);
return 0;
}上述两个代码的结果都是一样的,运行结果如下:
像这样的问题都是一些比较简单的算法,有时代码看起来很容易,但让自己去想,可能一时半会想不到,这就需要我们多去看书,多去总结和积累!
相关文章推荐
- 如何判断一个整数位的二进制中有多少个1
- 如何判断一个整数的二进制中有多少个1
- 浮点数在intel上的二进制存储结构,以及如何判断一个浮点数是否为整数
- 如何判断一个数的二进制有多少个1
- 如何以最优时间复杂度得出——判断一个字节内的整数的二进制形式中的1个数
- 浮点数在intel上的二进制存储结构,以及如何判断一个浮点数是否为整数
- 如何判断一个数的二进制有多少个1
- SQL Server中如何判断一个数据库是否存在
- 如何判断一个模板被实例化了几次?
- 如何判断一个数是否是4的幂
- 如何判断一个点是否在一个多边形内部+三角形有向面积公式
- 给定一个字符串如何判断该字符串中某一字符出现的频率并找出出现频率最高的字符和频率
- java如何判断一个linux下的文件是否为链接文件。
- 如何判断一个正整数是否是2的乘方
- 如何判断一个类中是否有虚函数
- 问题3:如何用递归算法判断一个数组是否是递增?
- 如何判断一个图是稀疏的还是稠密的
- C 如何判断一个数的位数
- c#如何将一个整数转换二进制,并进行位运算
- [VB.NET]如何在一个窗体M中判断另一个窗体N中是否存在一个名称为A的事件?