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

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

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

6 I5 Q( X# x- J) H- Z

! E9 C  ]9 P, w' W( T1 `- n. i
解 决 思 路( ^" D% r( G* M% h) W; q6 O" n: H
/ S( z+ ~4 D7 H, o# K4 C1 w
对于该问题,我们最先想到的是对原字节通过移位操作来逐位处理,使用另一个变量来存储交换后的结果。这种解决方案处理起来思路清晰,编写代码应该不难。

. V, ]. l( q/ s! \
下面是该思路对应的代码:
( |- Y" M( w9 T
微信图片_20201105190623.png
1 M- g' c6 ~6 ]: n3 G
上述代码实现起来不难,而且效率还是比较高的。

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

) z4 U: m2 y; w# A; }7 n! [. e
这里主要再介绍一下蝶式交换法。

! _9 S% Y6 ~, s- R' j- R
所谓的蝶式交换是这样的:

: D" ]$ J. d& D3 X1 p
微信图片_20201105190627.png
+ ~9 |, J$ a  J+ z: M2 H9 p
我们可以做一下执行演算:

% R# p# G+ X; e5 k0 n
假设原始位序列为  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$ K  c: T  D! _6 l* X: w% g& ^
data=((data<<1)&0xaa)|((data>>1)&0x55);  之后序列为 1 0 0 1  1 0 1 0
2 @/ H6 D6 `2 Y; M
更抽象的来说,原始位为 1 2 3 4  5 6 7 8
data=(data<<4)|(data>>4); 之后位序为  5 6 7 8  1 2 3 4
* ?- m, M( k- H4 C' Y
data=((data<<2)&0xcc)|((data>>2)&0x33);   之后位序为  7 8 5 6  3 4 1 2
0 q# c+ m7 W, ?7 v$ O7 P
data=((data<<1)&0xaa)|((data>>1)&0x55);   之后位序为  8 7 6 5  4 3 2 1  

0 d( I8 M, u  n( e1 O0 B; i
由此完成了整个位的逆序转换,下面是具体的实现代码:

9 ]# X0 r1 O& _! k+ I
微信图片_20201105190632.png

, \: D" c* x0 h: k- Y) a
( n' o% [6 u2 Z3 V- |
结 语
' V- a: g; T! [6 Q

6 S% }) _; d8 l5 |. W9 |
交换字节的高低位并不是一个很常见的问题,遇到该问题时,需要经过仔细的分析,加上对C语言位操作的熟练掌握,就能够很好的解决这一类的问题。
- z# c( U" \& @# G2 f; I
赞 收藏 1 评论3 发布时间:2020-11-5 19:07

举报

3个回答
goyhuan 回答时间:2020-11-6 08:34:57
蝶式交换
西点钟灵毓秀 回答时间:2020-11-6 11:56:37
用位变量来解决不更香嘛?
* k+ w. y: O3 h8 P/ }  O) D% Sunion sample
3 `4 Z# V! _* M2 ^{7 k) l$ t1 p. l9 ^
struct err
. t' _9 m- C6 W  N: g{; F$ l7 t  e2 \
unsigned char bit0 : 1;" Q1 P( X' L' B- W8 _7 ]
unsigned char bit1 : 1;
3 U* i- n$ D& F% I/ w% Cunsigned char bit2 : 1;: _3 b# _' U( ^
unsigned char bit3 : 1;
& p2 a5 d8 e. R3 s, V7 F; Tunsigned char bit4 : 1;# u- @+ @3 N" W. W' }0 }
unsigned char bit5 : 1;
$ a' e6 \0 u6 ]' ?1 nunsigned char bit6 : 1;) }! m2 A( P' c+ t. }+ I+ x3 f2 P6 Z
unsigned char bit7 : 1;
; n) ?8 _# Q0 x+ o} flag;
3 R' ^0 p7 Q$ x, Runsigned char bit_all;
5 V3 B8 c' i, t. _0 Q( P}led;
zlutian 回答时间:2020-12-19 22:58:10
学习了,谢谢!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版