导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

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

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;
}


怎么理解这个函数。
...全文
68 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
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#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.