题目中要求执行效率要尽可能的高,我只想到了将除法改为位运算符来实现,还有很多没有考虑的地方。
下面通过几个程序来看这个问题:
1.最简单的程序
#include <iostream>
using namespace std;
int main()
{
unsigned int b_num;
int i_count=0;
cout<<"请输入一个1~256之间的整数"<<endl;
cin>>b_num;
while(b_num != 0)
{
if(b_num%2 != 0)
{
i_count++;
}
b_num /=2;
}
cout<<i_count<<endl;
}
2, 改进方案,将其中的算法运算都改为位运算
(1)其中求模操作就是为了看二进制的最后一位是否为1,可以与1进行与操作就可以判断最后一位是不是1了
(2)除法运算改为右移位运算,进行完移位操作不要忘记赋值
改进的程序如下:
#include <iostream>
using namespace std;
int main()
{
unsigned int b_num;
int i_count=0;
cout<<"请输入一个1~256之间的整数"<<endl;
cin>>b_num;
while(b_num)
{
i_count += (b_num&1);
b_num>>=1;
}
cout<<i_count<<endl;
}
上述两种方法都是取数的一半,循环进行操作,因此时间复杂度为log2n
(3)是否可以寻找一种只与1的个数有关的数量级的时间复杂度 (感觉这个思想特别好)

这篇博客探讨了如何高效地计算一个8位字节变量中二进制表示中1的个数,强调执行效率。文章通过比较几种方法,包括位运算优化、空间换时间策略等,并分析了各种方法的时间复杂度。还提出了扩展问题,如32位变量的情况以及计算两个正整数位差异的方法。
的变量,求二进制表示中1”的个数,要求算法的执行效率尽可能的高&spm=1001.2101.3001.5002&articleId=20897737&d=1&t=3&u=e2c583662bf344ccb4c96719c810e55a)
525

被折叠的 条评论
为什么被折叠?



