提示:仅供参考,如有错误,还望指出。
目录
文章目录
前言
一、解决方案
1.初始
1.1刚开始想到的
1.2修改后
1.3另外的方法
2.进阶
二、新引出的问题
总结
前言
在笔试和面试时,我们不免会遇到一个这样的问题。
请输入一个整数,求出它的二进制中1的个数。
以下就是对于这个问题的一些解决办法。
一、解决方案
1.初始
1.1刚开始想到的
1.1刚开始想到的
该方法是通过计算一个数的十位,百位获得灵感而得来的。
可输入负数时,与预想的不同。故还是需要修改。
int count_bit_one(int a)
{
int count = 0;
while (a)
{
if (a % 2 != 0)
{
count++;
}
a = a / 2;
}
return count;
}
1.2修改后
修改后也就是在函数上加上了一个unsigned。
也就是意味着将输入的值由有符号数转化为无符号数。进而可以算出1的个数。
int count_bit_one(unsigned int a)
{
int count = 0;
while (a)
{
if (a % 2 != 0)
{
count++;
}
a = a / 2;
}
return count;
}
1.3另外的方法
若想不出上述的方法,还可以用另外一种。
主要的思想是:将a的二进制序列一个一个与1比较
int count_bit_one(int a)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if (((a >> i)& 1) == 1)
{
count++;
}
}
return count;
}
2.进阶
在通过大量计算,得出的这种算法效率最高。
例如:算出12的二进制序列中1的个数
代码:
int count_bit_one(int a)
{
int count = 0;
while (a)
{
a = a & (a - 1);
count++;
}
return count;
}
二、新引出的问题
求出两个数的二进制序列中不同的个数
这时我们先求出两数二进制序列的不同,即可以通过疑异或得到。
而异或是代表这二者相异为1,这时就可以用上求出二进制序列中1的个数来求得二者相异的个数。
代码:
int count_two_bit_same(int a, int b)
{
int count = 0;
int c = a ^ b;
while (c)
{
c = c & (c - 1);
count++;
}
return count;
}
总结
这里对文章进行总结:一个二进制的求解都有多种,当然还是建议用最优解。也体现出算法的重要性。最后,我们应该也要举一反三。
如果还是有些许的不理解就看鹏哥的视频吧。
链接如下:22.作业讲解(2)(C语言程序设计教程谭浩强 c语言谭浩强视频教程 c语言零基础入门教程 学习c语言 c语言视频教程 c语音 C语言教程 C语言编程项目 C语_哔哩哔哩_bilibili



