| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1049 人关注过本帖, 3 人收藏
标题:C面试题求解
只看楼主 加入收藏
wolf赵帅
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-11-8
结帖率:50%
收藏(3)
 问题点数:0 回复次数:12 
C面试题求解
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}


    假定x = 9999. 答案:8

搜索更多相关主题的帖子: return 答案 
2011-04-25 00:21
王立帅
Rank: 3Rank: 3
来 自:山东淄博
等 级:论坛游侠
帖 子:61
专家分:160
注 册:2011-4-4
收藏
得分:0 
你在while循环里面,写一个printf("%d",x)语句看看x值得变化

一个人走
2011-04-25 09:26
吴军林
Rank: 2
等 级:论坛游民
帖 子:14
专家分:12
注 册:2011-4-19
收藏
得分:0 
不明白你在问什么。。。。是改错还是???
2011-04-25 09:40
王立帅
Rank: 3Rank: 3
来 自:山东淄博
等 级:论坛游侠
帖 子:61
专家分:160
注 册:2011-4-4
收藏
得分:0 
和同学商量了一下,不知道这个方法对不对,你可以先找到比9999小的最大的那个2的次方数 ,这里是8192:10000000000000。找到这个数后9999表示起来就很简单了,只要算出从9999到8192一共多少次就OK了。8191的二进制数是01111111111111。自然 8192 & 8191 = 0。

一个人走
2011-04-25 09:50
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 楼主 wolf赵帅
你直接把 9999 转成二进制,然后数一下有几个 1 就好。
分析:
对于任意正整数 a == 2 ^ n
其二进制写法为:
1000...0000    (n 个 0)
a - 1 为:
0111...1111    (n 个 1)
显而易见,a & (a - 1) == 0

且对于任意正整数 x,x = 2 ^ e[1] + 2 ^ e[2] + ... 2 ^ e[n]    (e[i] >= 0)均成立

结论:
程序运行结果为 n,即正整数 x 的二进制形式中 1 的个数;
对于 x < 0 就不用多解释了吧

[ 本帖最后由 voidx 于 2011-4-25 11:12 编辑 ]
2011-04-25 10:06
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
其实 5楼 的分析抓住了要点。这个函数就是返回 x 中为 1 的比特位的个数。

只不过 5楼 分析的好像抽像了点,这个函数的工作原理其实只要能说明下面这个事实就行了:
 x = x&(X-1) 这个操作,会使 x 中为 1 的比特位数减少一。

这很好说明。

如果 x 的最末一位是 1,即 x 是形如 aaaaaaa1 这样一个数,a 不是 0 就是 1,我们不关心。那么 x - 1 则是 aaaaaaa0。
大家都知道:0&0 = 0, 1&1 = 1,1&0 = 0。所以与完了肯定是 aaaaaaa0,这个数和 x 比前面全一样,就是最后一位的 1 没了。所以它含有的 1的位数比 x 少一。

如果 x 的最末位不是1,那么 x 肯定是形如 aaaaaaa0 这样的一个数,如果 a 全是 0,那么 while 循环就退出了。假设最右面的一个不为0的a是倒数第二个a。(是其它的位也不要紧,我们此处只关心最右边的那个是1的位,其它的不关心)
那么 x 即是 aaaaa100,于是 x-1 则是 aaaaa011。与一下很明显的結果是 aaaaa000。还是会抹去 一个1.

现在結果很清楚了,其实 x&(x-1) 就是将  x中的  最低的一个为1的位  置0。
count 就是在数这件事一共干了几回。如果干了3回 x 就变成 0 了,就说明 x 里一共有三个为1的位。

9999 的二进制写法是 10011100001111 一共8个1。


[ 本帖最后由 pangding 于 2011-4-25 15:00 编辑 ]
2011-04-25 14:55
相望あ江湖
Rank: 2
等 级:论坛游民
帖 子:11
专家分:25
注 册:2011-4-6
收藏
得分:0 
好想法,路过,赞叹下~~~
2011-04-25 15:52
flylee
Rank: 5Rank: 5
等 级:职业侠客
帖 子:309
专家分:374
注 册:2004-8-10
收藏
得分:0 
编程之美上面到。。。
2011-04-25 17:43
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
学习!!!

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-04-25 17:46
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 6楼 pangding
据说你是学数学的,嘿嘿,以后我有问题就请教你了
2011-04-25 18:52
快速回复:C面试题求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013319 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved