这个函数怎么快速知道结果

delectation 2008-10-10 04:42:09
static int test()
{
int x = 9999;
int count=0;
while (Convert.ToBoolean(x))
{
count++;
x=x&(x-1);
Console.WriteLine(x);

}
return count;
}


怎么理解这个函数。
...全文
81 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Eagle_ice 2008-10-12
一楼了 想通了 就结帖撒....
  • 打赏
  • 举报
回复
zcs302 2008-10-12
想通了
  • 打赏
  • 举报
回复
dlmeijianyu 2008-10-10
一楼的是正确的.
  • 打赏
  • 举报
回复
ChargeForward 2008-10-10
[Quote=引用 1 楼 cpio 的回复:]
用来求一个整数的二进制表示时,有多少个1
[/Quote]
正解!
  • 打赏
  • 举报
回复
止戈而立 2008-10-10
[Quote=引用 4 楼 Jack_xiao 的回复:]
返回值count是8
9,9,9,9
1001,1001,1001,1001
9,9,9,8 =>返回值是7
1001,1001,1001,1000 =>7个1
9,9,9,7 =>返回值是7
1001,1001,1001,0111 =>9个1

一楼说的似乎不大对
[/Quote]

你的x变量是十进制的,并非十六进制,怎么可以转成这呢?
9999的二进制是:
0010011100001111

8个1
  • 打赏
  • 举报
回复
Jack_xiao 2008-10-10
这个函数似乎是一个衰变,返回值就是某个数按照这个衰变变为0的步数
  • 打赏
  • 举报
回复
Jack_xiao 2008-10-10
返回值count是8
9,9,9,9
1001,1001,1001,1001
9,9,9,8 =>返回值是7
1001,1001,1001,1000 =>7个1
9,9,9,7 =>返回值是7
1001,1001,1001,0111 =>9个1

一楼说的似乎不大对
  • 打赏
  • 举报
回复
Jack_xiao 2008-10-10
运行一下:
9998
9996
9992
9984
9728
9216
8192
0
  • 打赏
  • 举报
回复
cpio 2008-10-10
(Convert.ToBoolean(x))
判断是否含有1,如果有的话,肯定为真,count加1

x = x & (x - 1);去掉它的一个1

如果x最后一位是1,很明显,去掉了一个1

****1,减1的话,变成****0,再与一下,结果还是****0,少了最后的1

如果最后一位不是1

****0,减1之后,再与一下,最后一位肯定也是0,由于最后一位是0,减一之后肯定影响前面的,前面的也会少一个1

这样到最后没有1的时候就结束了,返回1的个数
  • 打赏
  • 举报
回复
cpio 2008-10-10
用来求一个整数的二进制表示时,有多少个1
  • 打赏
  • 举报
回复
相关推荐
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2008-10-10 04:42
社区公告

让您成为最强悍的C#开发者