打印

请教奇偶判断的方法

[复制链接]
5502|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ayi|  楼主 | 2007-11-19 10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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把问题说清楚先!

使用特权

评论回复
5
ayi|  楼主 | 2007-11-19 13:44 | 只看该作者

re

不好意思,我说明白点,用程序判断32位(4个8位的字节)里“1”的个数,我现在用的就是移位的方法,但是要移32次才知道一共有多少个“1”,想问一下有没有更好更方便的方法

使用特权

评论回复
6
ayb_ice| | 2007-11-19 13:47 | 只看该作者

就目前的情况移位要好些

使用特权

评论回复
7
xwj| | 2007-11-19 14:01 | 只看该作者

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

4bit查表算是空间和性能的折中,但不一定能比移位快多少

使用特权

评论回复
8
农民讲习所| | 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, 偶

使用特权

评论回复
9
hotpower| | 2007-11-19 14:26 | 只看该作者

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

使用特权

评论回复
10
ayb_ice| | 2007-11-19 14:33 | 只看该作者

人家是要1的个数

使用特权

评论回复
11
农民讲习所| | 2007-11-19 14:35 | 只看该作者

晕,搞错了

使用特权

评论回复
12
科科| | 2007-11-19 15:41 | 只看该作者

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

使用特权

评论回复
13
xwj| | 2007-11-19 16:04 | 只看该作者

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

呵呵,先不管LZ的主题:-)

使用特权

评论回复
14
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;
}

使用特权

评论回复
15
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;
}

使用特权

评论回复
16
ayi|  楼主 | 2007-11-19 17:20 | 只看该作者

re

看来还是用移位了

使用特权

评论回复
17
平常人| | 2007-11-22 21:07 | 只看该作者

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

https://bbs.21ic.com/club/bbs/list.asp?boardid=40&t=2269003

使用特权

评论回复
18
hotpower| | 2007-11-23 07:51 | 只看该作者

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

使用特权

评论回复
19
dld2| | 2007-11-23 08:14 | 只看该作者

原来是这样啊

使用特权

评论回复
20
xwj| | 2007-11-23 08:44 | 只看该作者

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

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


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


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

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

--51上还是查表最快:-)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

ayi

11

主题

30

帖子

0

粉丝