| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2462 人关注过本帖
标题:数一个数用二进制表示有几个1,为什么要定义成 unsigned char x ?? 试了一 ...
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
能理解这个做法么?
程序代码:
#include<stdio.h>
int count(int a)
{
    int c;
    for(c = 0; a; a &= a - 1) c++;
    return c;
}
int main()
{
    int i;
    scanf("%d", &i);
    printf("%d\n", count(i));
    return 0;
}

重剑无锋,大巧不工
2012-01-11 22:25
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
回复 11楼 beyondyf
厉害,见识了,这个决对快
用3&2 4&3 试了一下,
这也是数bit啊,
谢~~~

The quieter you become, the more you can hear
2012-01-11 22:38
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
那你解释一下吧,我想看看你理解到了什么程度

重剑无锋,大巧不工
2012-01-11 22:43
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
回复 13楼 beyondyf
嗯,让我想想,这个~
    5 & 4 == 4
    4 & 3 == 0
    如果是求5 中的1 判断3 次,为2
    如果 a > 0 则c++ 至少为1
    然后 a & a-1 
    然后 a & a-1 
    然后 a & a-1 
    然后 a & a-1 
    然后就不明白为什么了,
    还望beyondyf不令赐教

The quieter you become, the more you can hear
2012-01-11 22:58
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵
a - 1 的结果相当于将 a 最末尾的1变为0,之后的0变为1。
a - 1 和 a 按位与运算的结果相当于删去 a 最末尾的1。
循环的次数只与a中所含的1的数量有关,与其大小无关。
对于采用补码表示的负数亦有效,不需要声明为无符号类型。

重剑无锋,大巧不工
2012-01-11 23:13
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
呵呵,你们俩都没建立相同的解空间啊,是吧!大侠?

My life is brilliant
2012-01-11 23:19
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
回复 15楼 beyondyf
原来如此,非常感謝~~

The quieter you become, the more you can hear
2012-01-11 23:19
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
程序代码:
#include <stdio.h>

static int map[] = {
   0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
};

int calculate(int value) {
   int i, count = 0;
   for (i = 0; i < sizeof(int); ++i) {
      count += map[value & 0xFF];
      value >>= 8;
   }
   return count;
}

int main() {
   int x;
   scanf("%d", &x);
   printf("%d\n", calculate(x));
   return 0;
}
这样似乎也行哦?

[ 本帖最后由 lz1091914999 于 2012-2-18 22:40 编辑 ]

My life is brilliant
2012-01-12 00:23
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
回复 17楼 madfrogme
循环的算法是o(n)的,不确定的时序,而且for的overhead代价很高的
要最快,直接查表,o(1)

技术问题,请不要以短消息方式提问
2012-01-13 22:15
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
回复 楼主 madfrogme
bitcount函数改为 bitcount(signed int)不行的原因是:如果调用bitcount(-1),那个for将进入死循环,因为c标准规定c语言里的移位是算术移位,移位是分无符号数和有符号数的。
2012-01-13 23:55
快速回复:数一个数用二进制表示有几个1,为什么要定义成 unsigned char x ?? ...
数据加载中...
 
   



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

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