用位逻辑取一个整数中1的个数算法问题

duanyongzhi 2009-10-12 02:27:58
int bitcount(int n)
{
int count=0;
do{
if(n%10 == 1)
count++;
}while((n /= 10) > 0);
return count;
}
上面是我自已想到的取整数中1的个数算法.
下面是书上的算法,但我根本看不懂,请各位帮我看看。

int bitcount(int n)
{
int count;
for(count = 0; n != 0;n>>=1)
if(n&o1)
b++;
return b;
}
...全文
122 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
玖伍叁柒 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 rush2 的回复:]
C/C++ codeint count(unsignedint x) {int i=0;for(i=0; x>=0; x/=2)
{
i= x%2;
}return i;
}
}
[/Quote]

汗死,写错了个符号
i += x%2;
duanyongzhi 2009-10-12
  • 打赏
  • 举报
回复
ls正解。
mstlq 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 duanyongzhi 的回复:]
引用 11 楼 mstlq 的回复:
引用 9 楼 duanyongzhi 的回复:
ls的函数不怎么准确啊。i = x%2,这样i的值只有两种可以要么是1要么是0,如果一个整数是11111111用这个函数求的结果是1个1而实际上是8个1


那个函数的结果跟楼主书中的一样……

怎么会一样呢,仔细看这个函数就知道i的值是随x的值变化的"i = x%2"而x的值在for循环终止时可能是1或0,这样i的值也就是1或0了。函数的目标是得到一个整数中1的个数所以需要改动一下才对。

int  count(unsigned int x) {
  int i = 0;
  for(i = 0; x >= 0; x /= 2)
  {
      if(x%2==1)
        i++;
  }
  return i;
}


[/Quote]

呵呵,还是您细心……
不过写
if(x%2==1)
        i++;
费劲,还是写
i+=x%2吧……
duanyongzhi 2009-10-12
  • 打赏
  • 举报
回复
写错了 "在for循环终止时可能是1或0"要改成“在for循环终止之前是1或0”
duanyongzhi 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mstlq 的回复:]
引用 9 楼 duanyongzhi 的回复:
ls的函数不怎么准确啊。i = x%2,这样i的值只有两种可以要么是1要么是0,如果一个整数是11111111用这个函数求的结果是1个1而实际上是8个1


那个函数的结果跟楼主书中的一样……
[/Quote]
怎么会一样呢,仔细看这个函数就知道i的值是随x的值变化的"i = x%2"而x的值在for循环终止时可能是1或0,这样i的值也就是1或0了。函数的目标是得到一个整数中1的个数所以需要改动一下才对。

int count(unsigned int x) {
int i = 0;
for(i = 0; x >= 0; x /= 2)
{
if(x%2==1)
i++;
}
return i;
}

duanyongzhi 2009-10-12
  • 打赏
  • 举报
回复
我明白了
int bitcount(int n)
{
int count;
for(count = 0; n != 0;n>>=1)
if(n&o1)
b++;
return b;
}
这个函数得到的不是一个10进制中1的个数,而是将一个10进制转成2进制后计算其中1的个数。而我一直把它当成计算10进制中1的个数来看,所以看来看去都没懂。
mstlq 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 duanyongzhi 的回复:]
ls的函数不怎么准确啊。i = x%2,这样i的值只有两种可以要么是1要么是0,如果一个整数是11111111用这个函数求的结果是1个1而实际上是8个1
[/Quote]

那个函数的结果跟楼主书中的一样……
ZXW0521 2009-10-12
  • 打赏
  • 举报
回复
比如15,这个数字,
用10进制,表示,就是15,
换成2进制,就是1111,
用lz自己的算法,能得到里面有1个1,

而实际上,
数据在计算机里,全是存为2进制的,
所以应该是4个1,
duanyongzhi 2009-10-12
  • 打赏
  • 举报
回复
ls的函数不怎么准确啊。i = x%2,这样i的值只有两种可以要么是1要么是0,如果一个整数是11111111用这个函数求的结果是1个1而实际上是8个1
玖伍叁柒 2009-10-12
  • 打赏
  • 举报
回复
int  count(unsigned int x) {
int i = 0;
for(i = 0; x >= 0; x /= 2)
{
i = x%2;
}
return i;
}
}
duanyongzhi 2009-10-12
  • 打赏
  • 举报
回复
4楼给我点提示吧。也好让我从一个方面有点想头啊,不然真的是看天书了,呵呵。
duanyongzhi 2009-10-12
  • 打赏
  • 举报
回复
看4楼的就像看书一样,不懂。
duanyongzhi 2009-10-12
  • 打赏
  • 举报
回复
书本那个2进制的.....怎么解释啊。
pcboyxhy 2009-10-12
  • 打赏
  • 举报
回复
int  count(unsigned int 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;
}

玖伍叁柒 2009-10-12
  • 打赏
  • 举报
回复
%2
/2
就可以了
mstlq 2009-10-12
  • 打赏
  • 举报
回复
楼主写的是10进制的……
书本写的是2进制的……
TianYiXiang 2009-10-12
  • 打赏
  • 举报
回复
1&1 == 1

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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