一个还算简单的题目,高手应该能很快做出来.

totopa1 2009-03-06 01:20:24
今天遇到一个貌似蛮简单的题目:写一个函数,计算数字中二进制位为'1'的个数。
郁闷的是,我写了蛮久,只会按位与...请尽量不要带什么库,最好只用基本语法实现.
...全文
209 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
piaomiao163 2009-03-06
  • 打赏
  • 举报
回复
我写的.




/*
十进制转二进制:
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写 就是结果
例如302
302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
故二进制为100101110

二进制转十进制
从最后一位开始算,依次列为第0、1、2...位
第n位的数(0或1)乘以2的n次方
得到的结果相加就是答案
例如:01101011.转十进制:
第0位:1乘2的0次方=1
1乘2的1次方=2
0乘2的2次方=0
1乘2的3次方=8
0乘2的4次方=0
1乘2的5次方=32
1乘2的6次方=64
0乘2的7次方=0
然后:1+2+0
+8+0+32+64+0=107.
二进制01101011=十进制107.
*/
#include <iostream>
using namespace std;

class BinarySystem
{
public:
BinarySystem( int number );
int bCout();
private:
int rNum;
};

BinarySystem::BinarySystem( int number )
{
rNum = 0;
int result(number),residue(0);
while( result != 1 )
{
result = result / 2 ;
residue = number % 2;
if( residue == 1 )
++rNum;
}
}

int BinarySystem::bCout()
{
rNum += 1 ;
return rNum;
}

int main()
{
cout << "Please insert a number " << endl;
int a,b;
cin >> a;
BinarySystem binary( a );
b = binary.bCout();
cout << "The number is " << b << endl;
system("pause");
}


xuhb95083023 2009-03-06
  • 打赏
  • 举报
回复
编译期的实现


#include <iostream>

using namespace std;

template <int num>
struct bit1_count{
enum { result = (num & 1 == 1 ? 1 : 0) + bit1_count<(num >> 1)>::result};
};

template <>
struct bit1_count<0> {
enum { result = 0 };
};

int main() {

cout << bit1_count<1>::result << endl;
cout << bit1_count<2>::result << endl;
cout << bit1_count<3>::result << endl;
cout << bit1_count<7>::result << endl;
cout << bit1_count<1024>::result << endl;

::system("PAUSE");

return 0;

}
米格315 2009-03-06
  • 打赏
  • 举报
回复
根据十一楼的想法编写的:一个奇数/2后的二进制数1个数+1就得到原来的二进制数

int bit_count(int a )
{
int b=0;
while(a)
{
if(a%2)
b++;
a=a/2;
}
return b;
}
xuhb95083023 2009-03-06
  • 打赏
  • 举报
回复

#include <iostream>

using namespace std;

inline int bit_one_count(int i) {
int num = 0;
while (0 != i) {
num += i & 1 ? 1 : 0;
i >>= 1;
}
return num;
};

int main() {
cout << bit_one_count(1) << endl;
cout << bit_one_count(2) << endl;
cout << bit_one_count(3) << endl;
cout << bit_one_count(1024) << endl;

::system("PAUSE");

return 0;

}
daidodo 2009-03-06
  • 打赏
  • 举报
回复
mark
霍大脚 2009-03-06
  • 打赏
  • 举报
回复
一个奇数/2后的二进制数1个数+1就得到原来的二进制数
danxuezx 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 brookmill 的回复:]
从书上抄来的,我自己是彻底看不懂

C/C++ code#include <stdio.h>
// Hacker's Delight, 5-1
// Figure 5-2 Counting 1-bits in a word.
int pop(unsigned x) {
x = x - ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x + (x >> 4)) & 0x0F0F0F0F;
x = x + (x >> 8);
x = x + (x >> 16);
return x & 0x0000003F;
}
[/Quote]
这个更经典,速度快。尤其是大数。假如是0xffffffff,3楼的方法需要循环32次,
且中间要比较语句,而这个就只要这几步就好了。
danxuezx 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hairetz 的回复:]
好多面试题都有这个...这个没有按位与了,你看看.

C/C++ code
int bit_count(unsigned int n)
{
int count;
for(count=0; n; n&= n- 1)
count++;
return count;
}

void main()
{
unsigned int n;
int cnt;
cout <<"Input your num:" <<endl;
cin>>n;
cnt=bit_count(n);
cout <<"count num of bits :" <<cnt <<endl;
}
[/Quote]
经典!!!!
david_sky_yang 2009-03-06
  • 打赏
  • 举报
回复
3楼正解
vincent_1011 2009-03-06
  • 打赏
  • 举报
回复
不用考虑浮点数-_-
brookmill 2009-03-06
  • 打赏
  • 举报
回复
从书上抄来的,我自己是彻底看不懂
#include <stdio.h>
// Hacker's Delight, 5-1
// Figure 5-2 Counting 1-bits in a word.
int pop(unsigned x) {
x = x - ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x + (x >> 4)) & 0x0F0F0F0F;
x = x + (x >> 8);
x = x + (x >> 16);
return x & 0x0000003F;
}

int main()
{
unsigned long x;
while (1)
{
printf("input an integer: ");
scanf("%d", &x);
if (x == 0)
break;
printf("0x%08X: Number of 1-bits: %d\n", x, pop(x));
}
return 0;
}
pengzhixi 2009-03-06
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
我还见过一个牛人用宏写的..很牛比..
帖出来给你看下吧,
#define POW(c) (1<<(c))
#define MASK(c) (((unsigned long)-1) / (POW(POW(c)) + 1))
#define ROUND(n, c) (((n) & MASK(c)) + ((n) >> POW(c) & MASK(c)))

int count(int n)
{
n= ROUND(n,0);
n= ROUND(n,1);
n= ROUND(n,2);
n= ROUND(n,3);
n= ROUND(n,4);
return n;
}
  • 打赏
  • 举报
回复
好多面试题都有这个...这个没有按位与了,你看看.

int bit_count(unsigned int n)
{
int count;
for(count=0; n; n&= n- 1)
count++;
return count;
}

void main()
{
unsigned int n;
int cnt;
cout <<"Input your num:" <<endl;
cin>>n;
cnt=bit_count(n);
cout <<"count num of bits :" <<cnt <<endl;
}
xtting_8984313 2009-03-06
  • 打赏
  • 举报
回复
lz下载一本hacker‘s delight
里面全是类似的问题解法。
guoqiang721029 2009-03-06
  • 打赏
  • 举报
回复
函数的参数是以什么格式给出这个二进制数的,是字符串还是整数?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧