请教奇偶判断的方法

[复制链接]
6656|23
 楼主| ayi 发表于 2007-11-19 10:39 | 显示全部楼层 |阅读模式
判断一组数据里(32位)”1“的个数有多少个用什么方法,简便的方法,只需要说明一下方法,不用贴程序,谢谢
xwj 发表于 2007-11-19 10:49 | 显示全部楼层

到底是要判断个数还是判断奇偶?

判断奇偶直接把每一位异或,一个门延迟时间就出来了

判断个数的话用程序就是移位,加;用门电路就是二进制加法
dld2 发表于 2007-11-19 11:01 | 显示全部楼层

呵呵,俺的笨办法

把32bit分成8个4bit。每个4bit中有多少个一用查表。
xwj 发表于 2007-11-19 11:07 | 显示全部楼层

LS,为什么要用4bit查表?

LZ把问题说清楚先!
 楼主| ayi 发表于 2007-11-19 13:44 | 显示全部楼层

re

不好意思,我说明白点,用程序判断32位(4个8位的字节)里“1”的个数,我现在用的就是移位的方法,但是要移32次才知道一共有多少个“1”,想问一下有没有更好更方便的方法
ayb_ice 发表于 2007-11-19 13:47 | 显示全部楼层

就目前的情况移位要好些

xwj 发表于 2007-11-19 14:01 | 显示全部楼层

移位是最方便的,要快的话就查表

4bit查表算是空间和性能的折中,但不一定能比移位快多少
农民讲习所 发表于 2007-11-19 14:04 | 显示全部楼层

51里面是很简单的

 ACC = mData[0];
 CY = P;

 ACC = mData[1];
 if( P ){
    CY = ~CY;
 }

 ACC = mData[2];
 if( P ){
    CY = ~CY;
 }

 ACC = mData[3];
 if( P ){
    CY = ~CY;
 }

 CY=0, 偶
hotpower 发表于 2007-11-19 14:26 | 显示全部楼层

还是我们村长有办法~~~

ayb_ice 发表于 2007-11-19 14:33 | 显示全部楼层

人家是要1的个数

农民讲习所 发表于 2007-11-19 14:35 | 显示全部楼层

晕,搞错了

科科 发表于 2007-11-19 15:41 | 显示全部楼层

移位就可以,你对时间要求很严格吗?

xwj 发表于 2007-11-19 16:04 | 显示全部楼层

觉得老农的那个程序很有问题,一系列操作后CY还是原来的值

呵呵,先不管LZ的主题:-)
lenglx 发表于 2007-11-19 16:52 | 显示全部楼层

在51上你还不如1位1位的判断

如果在诸如ARM等32位处理器上,你可以使用以下函数:

unsigned long CalOneBits(unsigned long val)
{
    val = (val & 0x55555555) + ((val & 0xaaaaaaaa) >> 1);
    val = (val & 0x33333333) + ((val & 0xcccccccc) >> 2);
    val = (val & 0x0f0f0f0f) + ((val & 0xf0f0f0f0) >> 4);
    val = (val & 0x00ff00ff) + ((val & 0xff00ff00) >> 8);
    val = (val & 0x0000ffff) + ((val & 0xffff0000) >> 16);
    return val;
}
lenglx 发表于 2007-11-19 17:08 | 显示全部楼层

这样写能更好的实施优化

unsigned long CalOneBits(unsigned long val)
{
    val = (val & 0x55555555) + ((val>>1) & 0x55555555);
    val = (val & 0x33333333) + ((val>>2) & 0x33333333);
    val = (val & 0x0f0f0f0f) + ((val>>4) & 0x0f0f0f0f);
    val = (val & 0x00ff00ff) + ((val>>8) & 0x00ff00ff);
    val = (val & 0x0000ffff) + ((val>>16) & 0x0000ffff);
    return val;
}
 楼主| ayi 发表于 2007-11-19 17:20 | 显示全部楼层

re

看来还是用移位了
平常人 发表于 2007-11-22 21:07 | 显示全部楼层

看看俺在去年发的一个经典帖吧

https://bbs.21ic.com/club/bbs/list.asp?boardid=40&t=2269003
hotpower 发表于 2007-11-23 07:51 | 显示全部楼层

做个记号晚上带回家当夜宵~~~

dld2 发表于 2007-11-23 08:14 | 显示全部楼层

原来是这样啊

xwj 发表于 2007-11-23 08:44 | 显示全部楼层

呵呵,很妙的代码,平常人的解释更妙

很多算法用数学方法先分解、处理一下,都可以显著提高运算效率,这就是“算法”


隔位相加,递归后就是1的个数
隔位异或,递归后就是奇偶位


当然,整体的效率还是和处理器字长、指令有关,对于DSP指令可以得到显著优化,但对于普通MCU就难说了

就如14楼所说:
14楼: 在51上你还不如1位1位的判断

--51上还是查表最快:-)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

ayi

11

主题

30

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部