免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1541 | 回复: 7
打印 上一主题 下一主题

这个题目是生算出来的吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-02 14:56 |只看该作者 |倒序浏览
  1. #include <stdio.h>

  2. int f(int x) {
  3.         int c = 0;
  4.         while(x!=0) {
  5.                 x = x & (x-1);
  6.                 c++;
  7.         }
  8.         return c;
  9. }

  10. int main () {
  11.         int a = 65536 + 1024 + 8 + 1;
  12.         int b = f(a);        //执行后b等于多少?
  13.         printf("%d\n",a);
  14.         printf("%d\n",b);
  15.        
  16.         return 0;
  17. }
复制代码
这个是生算出来的么 我看不出其中有什么简便推导方法 请各位指教 多谢

论坛徽章:
0
2 [报告]
发表于 2012-04-02 15:05 |只看该作者
设 x % (2^k) == 0 且 x % (2^(k+1)) != 0 ,
那么 (x & (x-1)) == x - 2^k

比如 x==12时k==2,2^k==4
(x&(x-1)) == 12-4 == 8

为什么就不解释了 稍微想想就知道

那么
a == (2^16) + (2^10) + (2^3) + (2^0)
b ==     1      +     1      +     1    +    1     == 4

论坛徽章:
0
3 [报告]
发表于 2012-04-02 15:18 |只看该作者
回复 2# hbmhalley


    比如 x==12时k==2,2^k==4
(x&(x-1)) == 12-4 == 8
  
这句没看懂 为什么 x=12时 k=2呢

论坛徽章:
0
4 [报告]
发表于 2012-04-02 17:12 |只看该作者
回复 3# aore2010


    12%4 == 0
    12%8 == 4

论坛徽章:
0
5 [报告]
发表于 2012-04-02 17:57 |只看该作者
回复 4# hbmhalley


    没看太明白 那个k是通过12猜出来的么 如果不是12 是其他很大的数组 比如 134538 或者 12487 等等 该怎么计算呢

论坛徽章:
0
6 [报告]
发表于 2012-04-02 18:55 |只看该作者
回复 5# aore2010


    别纠结这个了 目的是让你拆成二进制看
    比如12 = (1100)2 ; 24 = (11000)2 ; 40 = (101000)2
    拿40说事:最右边的1及其后面的0构成 (1000)2 我说的2^k就是(1000)2,k就是0的个数:3。当然现在关于k的这些已经不重要了
    (101000)2 - 1 = (100111)2    只有原来 (1000)2 这部分变了。其实所有二进制数减一都是这个特点。不难理解吧
    如果拿原来的 (101000)2 和减一后的 (100111)2 做 '&' 运算,那么除了(1000)2这部分外,左边的都不动,右边的一定是0。结果是 (100000)2。也不难理解吧。
    所以每做一次 x=x&(x-1),其二进制表示里的1就少一个。
    所以答案就是 x 二进制表示里 1 的个数

论坛徽章:
0
7 [报告]
发表于 2012-04-02 21:25 |只看该作者
跟机器相关哈,不过f函数可以很容易看出是求x有多少个位是1.

论坛徽章:
0
8 [报告]
发表于 2012-04-02 22:10 |只看该作者
回复 6# hbmhalley
多谢多谢 呵呵

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP