你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

单片机中高低位交换——蝶式交换法

[复制链接]
gaosmile 发布时间:2020-11-5 19:07
问 题
对一个字节数据,逐个交换其高低位;例如11010001,经过0-7、1-6、2-5、3-4对应位的交换,变成10001011 。


解 决 思 路

对于该问题,我们最先想到的是对原字节通过移位操作来逐位处理,使用另一个变量来存储交换后的结果。这种解决方案处理起来思路清晰,编写代码应该不难。

下面是该思路对应的代码:

微信图片_20201105190623.png

上述代码实现起来不难,而且效率还是比较高的。

但是还有比这更简洁的解决方法,在嵌入式开发中遇到交换字节位的问题时,通常使用蝶式交换法和查表法来实现。查表法顾名思义即将一些值存到内存中,需要计算时查表即可,但是也会占用额外的存储空间。

这里主要再介绍一下蝶式交换法。

所谓的蝶式交换是这样的:

微信图片_20201105190627.png

我们可以做一下执行演算:

假设原始位序列为  0 1 0 1  1 0 0 1  
data=(data<<4)|(data>>4);之后序列为  1 0 0 1  0 1 0 1
data=((data<<2)&0xcc)|((data>>2)&0x33);  之后序列为  0 1 1 0  0 1 0 1
data=((data<<1)&0xaa)|((data>>1)&0x55);  之后序列为 1 0 0 1  1 0 1 0

更抽象的来说,原始位为 1 2 3 4  5 6 7 8
data=(data<<4)|(data>>4); 之后位序为  5 6 7 8  1 2 3 4
data=((data<<2)&0xcc)|((data>>2)&0x33);   之后位序为  7 8 5 6  3 4 1 2
data=((data<<1)&0xaa)|((data>>1)&0x55);   之后位序为  8 7 6 5  4 3 2 1  

由此完成了整个位的逆序转换,下面是具体的实现代码:

微信图片_20201105190632.png


结 语

交换字节的高低位并不是一个很常见的问题,遇到该问题时,需要经过仔细的分析,加上对C语言位操作的熟练掌握,就能够很好的解决这一类的问题。

收藏 1 评论3 发布时间:2020-11-5 19:07

举报

3个回答
goyhuan 回答时间:2020-11-6 08:34:57
蝶式交换
西点钟灵毓秀 回答时间:2020-11-6 11:56:37
用位变量来解决不更香嘛?
union sample
{
struct err
{
unsigned char bit0 : 1;
unsigned char bit1 : 1;
unsigned char bit2 : 1;
unsigned char bit3 : 1;
unsigned char bit4 : 1;
unsigned char bit5 : 1;
unsigned char bit6 : 1;
unsigned char bit7 : 1;
} flag;
unsigned char bit_all;
}led;
zlutian 回答时间:2020-12-19 22:58:10
学习了,谢谢!

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版