打印

转:16位整形数据按位反转C语言源码

[复制链接]
2037|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
拿起书本|  楼主 | 2014-11-13 14:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调试AD的时候,出现一个问题,无论是时钟信号,输入信号,还是AD使能信号输入都正常,可是采集到的数据都是不正常的,与实际的有很大的偏差,百思不得其解。查看原理图的时候猛然想起,在布板的时候,为了走线方便,把AD输出跟XINTF输入的高地位给颠倒了顺也就是说现在直接采集下来的数据经行位反转后才是正常的数值。按位反转的C代码如下:

其实反转的算法很简单,简单的描述一下:第一行代码为奇偶位相互交换;第二行为以两位为一单元,奇偶单元进行交换;第三行为以四位为一单元,奇偶单元进行交换;第四行为以八位为一单元,奇偶单元进行交换。至此,16位反转完成,算法结束。

Uint16 bit_reverse(Uint16 x)
{
        x = ((x >> 1) & 0x5555) | ((x << 1) & 0xaaaa);
        x = ((x >> 2) & 0x3333) | ((x << 2) & 0xcccc);
        x = ((x >> 4) & 0x0f0f) | ((x << 4) & 0xf0f0);
        x = ((x >> 8) & 0x00ff) | ((x << 8) & 0xff00);
        return x;
}
此处是对16位的整形数据进行的按位反转。如果需要,在最后一句后面加上下面这句:

        x = ((x >> 16) & 0x0000ffff) | ((x << 16) & 0xffff0000);
也就是以十六位为一单元,奇偶单元进行交换。同时注意补全前面与移位后的数据按位与的值。

很简单的一处小细节,却让我伤透了脑筋。看来细节决定成败还真没错。不过带上这个小算法对系统的实时性稍有影响。等下次板子打样的时候得改过来。

相关帖子

沙发
zhangmangui| | 2014-11-13 22:25 | 只看该作者
学习  谢谢分享

使用特权

评论回复
板凳
edishen| | 2014-11-16 11:06 | 只看该作者

使用特权

评论回复
地板
小木欧尼| | 2014-11-16 11:37 | 只看该作者
资料不错

使用特权

评论回复
5
firstblood| | 2014-11-16 22:48 | 只看该作者
不错的资料分享,学习了。

使用特权

评论回复
6
elecintop| | 2014-11-30 13:25 | 只看该作者
不错,学习了

使用特权

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

本版积分规则

个人签名:好好学习,天天向上!

519

主题

4195

帖子

31

粉丝