这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 单片机中高低位交换算法-蝶式交换法的介绍

共14条 1/2 1 2 跳转至

单片机中高低位交换算法-蝶式交换法的介绍

工程师
2020-10-20 23:03:56     打赏

问题

对一个字节数据,逐个交换其高低位,例如11010001,经过0-7,1-6,2-5,3-4对应位的交换,变成10001011 。

解决思路

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


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

image.png

上述代码实现起来不难,而且效率还是比较高的。但是还有比这更简洁的解决方法,在嵌入式开发中遇到交换字节位的问题时通常使用蝶式交换法和查表法来实现。查表法顾名思义即将一些值存到内存中,需要计算时查表即可,但是也会占用额外的存储空间。这里主要再介绍一下蝶式交换法。


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

image.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  

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

image.png

总结

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




关键词: 蝶式交换法     算法     SWAP     高低位置换    

院士
2020-10-21 08:58:54     打赏
2楼

还有这么高级的算法啊!

我都是使用一个临时变量来处理。


工程师
2020-10-21 18:05:04     打赏
3楼

学习到了


工程师
2020-10-21 18:07:46     打赏
4楼

学习一下


工程师
2020-10-21 18:09:18     打赏
5楼

感谢分享


工程师
2020-10-21 18:15:13     打赏
6楼

学习一下


工程师
2020-10-21 18:20:43     打赏
7楼

学习到了


工程师
2020-10-21 18:23:30     打赏
8楼

学习了


高工
2020-10-21 22:42:45     打赏
9楼

介绍的非常详细


工程师
2020-10-22 22:54:13     打赏
10楼

介绍的非常不错


共14条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]