| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6992 人关注过本帖, 1 人收藏
标题:如何用位运算比较二进制数中1和0的个数
只看楼主 加入收藏
C_戴忠意
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:575
专家分:1349
注 册:2011-10-21
收藏
得分:0 
这个位运算还不是很明了,不过大概意思看明白了,谢谢...

编程之路定要走完……
2012-04-16 08:00
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 10楼 TonyDeng
这样子逐个计算跟b版的差不多,遇到大量数据的话会很慢的,有没有更优的算法呢?

酱油实习生
2012-04-16 12:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用墨清扬在2012-4-16 12:59:24的发言:

这样子逐个计算跟b版的差不多,遇到大量数据的话会很慢的,有没有更优的算法呢?

我给你这个代码和结果截图,是专门告诉你负数的左边全部是1,警惕对带符号整数作右移位操作,而不是要讲求什么效率。对32位整数而言,每个循环只是32次,而在当代计算机环境中,循环千万次所耗费的时间是多少,我不知道你的数据量大到哪去至于影响效率。有直接的代码不写,像这类右移位暗藏的隐患,谅你也意识不到。何况在要考虑舍弃前导0的时候,别的巧妙方法似乎也不会有。

有什么整数数据类型储存的位数过亿位呀?如果你有过亿的整数需要处理,处理这些整数本身就已经足够耗费时间,展开8倍也不过是线性常量扩展,吃得起鸡还打算省酱料钱?

[ 本帖最后由 TonyDeng 于 2012-4-16 13:18 编辑 ]

授人以渔,不授人以鱼。
2012-04-16 13:05
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 13楼 TonyDeng
哦……确实没仔细看,不好意思

酱油实习生
2012-04-16 14:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
主要的问题是,你要比较二进制表达式中0和1的数量差别,如果不舍弃前导0,这种比较基本上是没意义的,除非你找到能够满足这种需求的更高效算法,但我可以断言那些算法的晦涩程度足够抵销效率收益。比如4楼那个代码,将来你阅读的时候,首先得搜索回忆把那5行特异的字面值清晰化,记起为什么是这样的5个值,即使写了注释,也仍然要思考两三分钟才能理解。然后,当要考虑前导0问题的时候,至少得有一个算法查找过程,与其后补循环,不如一开始就在循环中解决了,还不用出现这种类似魔数般的东西。

[ 本帖最后由 TonyDeng 于 2012-4-16 14:48 编辑 ]

授人以渔,不授人以鱼。
2012-04-16 14:37
wuya156
Rank: 2
等 级:论坛游民
帖 子:29
专家分:38
注 册:2010-3-11
收藏
得分:0 
程序代码:
int i;
int j=`~i;
if(1==i)
    printf("1多");
if(0==i)
    printf("0多");
do{
    i&=i-1;
    j&=j-1;
}while((i!=0)&&(j!=0))
if(i)
    printf("1多");
else if((0==i)&&(0==j))
    printf("一样多");
else
    printf("0多");

凑个热闹

[ 本帖最后由 wuya156 于 2013-11-18 01:38 编辑 ]
2012-04-16 18:34
zanzan1986
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:140
注 册:2011-2-22
收藏
得分:0 
bool sss(int a)
{
    int i = 0;
    while(!a)
   {
       if(a&1) i++;
       a >>= 1;
   }
   return (a > 15);
}
2012-04-16 21:33
wuya156
Rank: 2
等 级:论坛游民
帖 子:29
专家分:38
注 册:2010-3-11
收藏
得分:0 
回复 9楼 beyondyf
4楼那个会限制使用数的位数为32位吧
2012-04-18 22:09
快速回复:如何用位运算比较二进制数中1和0的个数
数据加载中...
 
   



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

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