大家帮我看一道简单的算法题,我实在看不懂.

sleepsheep 2002-01-21 11:02:11
这个算法是计算bit string 中1的个数.
procedure bitcount(s:bit string)
count:=0;
while s<>0
begin
count:=count=1;
s:=s^(s-1);
end
{count is the number of 1s in s}
其中s:=s^(s-1)是什么意思?

...全文
198 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
孩皮妞野 2002-01-25
  • 打赏
  • 举报
回复
证明:假定s !=0, 且第一个非0位为第i位(LSB 到 MSB), 则s -1 与s相比
1. >i的位都相同;
2. <=i的位都相反

则s与s-1按位and 后, 得到的位串与原来的位串相比:
1.>i的位都相同;
2.<=i的位都为0

换句话说, count增加了一,而且为1的位的个数减少了1(而且一定是减少第一个非0位).
sleepsheep 2002-01-25
  • 打赏
  • 举报
回复
我想了想,为什么做逻辑与会每次减少一个1呢,能给个证明吗?能给个回答吗?
sinbad 2002-01-24
  • 打赏
  • 举报
回复
高,实在是高
王集鹄 2002-01-23
  • 打赏
  • 举报
回复
10000 and 01111 = 0//没有意义
孩皮妞野 2002-01-23
  • 打赏
  • 举报
回复
例如:
s=1010 0110
count=0

1:
cout=1
s=1010 0100

2
cout=2
s=1010 0000

3
count=3
s=1000 0000

4
count=4
s=0000 0000

s等于0,退出,输出4果然是很美妙的算法。比每位测试要快。真高。




lance 2002-01-23
  • 打赏
  • 举报
回复
gzgzg
mathe 2002-01-23
  • 打赏
  • 举报
回复
count=0
while(s!=0){count++;s&=(s-1);}
没有错。
其作用就是每一次去掉最后一个1。
好东东。
sleepsheep 2002-01-23
  • 打赏
  • 举报
回复
谢谢各位,大家共同进步.
孩皮妞野 2002-01-23
  • 打赏
  • 举报
回复
对一个很长的位串进行1计数可以:

int bits_set(int i)
{
int count = 0;
while(i){
++count;
i &=i-1;
}
return count;
}

//假定bitstring是以整数数组存放的
int bits_set(int *buff, size_t dimension)
{
int count =0;
for(size_t i=0; i<dimension, i++)
count +=bits_set(buff[i]);
return count;
}
jerryjoe 2002-01-23
  • 打赏
  • 举报
回复
哈哈,好!!果然这个版块不错
mutant 2002-01-23
  • 打赏
  • 举报
回复
对于整数统计非常方便啊,果然三人行必有我师。
Ignoramus 2002-01-23
  • 打赏
  • 举报
回复
计算bit位为1的个数
老熊宝宝 2002-01-23
  • 打赏
  • 举报
回复
的确是个好算法,以后就用它了,呵呵。
老熊宝宝 2002-01-23
  • 打赏
  • 举报
回复
我测试过了要快2-4倍。
freegoal 2002-01-23
  • 打赏
  • 举报
回复
逻辑与,mathe和ALNG对的
老熊宝宝 2002-01-23
  • 打赏
  • 举报
回复
真的比每们测试要快吗?
lhj 2002-01-23
  • 打赏
  • 举报
回复
确实妙
leopro 2002-01-22
  • 打赏
  • 举报
回复
我觉得你写的有错误
但是利用异或确实可以实现要求的功能
sleepsheep 2002-01-22
  • 打赏
  • 举报
回复
如果s:=s^(s-1)中^是异或,这个算法就不对了,但是如果^是逻辑与,那么
s:=s^(s-1)怎么解释呢,大家再看看吧,分数我一定会加的.
老熊宝宝 2002-01-22
  • 打赏
  • 举报
回复
比如a=10010,那么a-1 = 10001 a和a-1按位异或后就有:(按位异或就是不同时取1)
s=a^(a-1) = 10010^10001 = 11,所以你的算法是错的。
其实统计s中1的个数只要将s每次右移1位后再和1相与来测试就行了嘛。
加载更多回复(3)

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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