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

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

[复制链接]
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语言位操作的熟练掌握,就能够很好的解决这一类的问题。

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

举报

2个回答
乐天乐 回答时间:2020-11-6 08:34:57
蝶式交换
zts329547875 回答时间: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;

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

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