C++ 二进制表示
例如,sum(6)必须返回2,因为6的二进制版本是110 不确定逻辑是否正确C++ 二进制表示,c++,C++,例如,sum(6)必须返回2,因为6的二进制版本是110 不确定逻辑是否正确 int sum(int n) { int count = 0; while(n) { count += n & 1; n >>= 1; } return count; } int main(){ int n = 9001; cout << “The sum of bits for
int sum(int n)
{
int count = 0;
while(n)
{
count += n & 1;
n >>= 1;
}
return count;
}
int main(){
int n = 9001;
cout << “The sum of bits for number “ << n << “is” << sum(n) << endl;
retun 0;
}
int和(int n)
{
整数计数=0;
while(n)
{
计数+=n&1;
n>>=1;
}
返回计数;
}
int main(){
int n=9001;
cout如果您使用GCC作为编译器,请签出内置的\uuuuBuiltin\uPopCount()
。它以二进制表示返回1的数目
有关更多信息,请参阅
编辑2:我这里有一个不正确的解决方案,已将其删除。感谢评论指出了这一点。一如既往,解决这些问题的最佳方法是使用标准库。你们都研究了标准库中可用的工具,对吗
;-)
速度很快,因为它每1位只循环一次。您遇到的问题是什么?除非您正在寻找一个可以复制和粘贴的完整答案,否则我在这里看不到任何问题。您想问的是什么?在输入负数之前,您的代码是正常的……然后它将永远不会停止。我想知道它是否丑陋解决方案与否。如果是,那么我想确保我能写出一个好的解决方案。如果你知道体系结构没有内在地计算位的指令,这是一个非常好的解决方案(有些是这样的)std::bitset
解决方案允许实现使用这些指令,因此应该至少同样快,如果不是更快的话-假设您使用的是实现良好的库。+1用于尼斯算法。
#include <iostream>
#include <bitset>
template<class T>
size_t bits_in(T t)
{
return std::bitset<sizeof(t) * 8>(t).count();
}
int main()
{
using namespace std;
int i = 6;
cout << "bits in " << i << " : " << bits_in(i) << endl;
long l = 6353737;
cout << "bits in " << l << " : " << bits_in(l) << endl;
return 0;
}
bits in 6 : 2
bits in 6353737 : 11
int sum(int n)
{
int count = 0;
if (0 != n)
{
while(++count, n &= (n - 1));
}
return count;
}