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

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

[复制链接]
gaosmile 发布时间:2020-11-5 19:07
问 题
对一个字节数据,逐个交换其高低位;例如11010001,经过0-7、1-6、2-5、3-4对应位的交换,变成10001011 。
' |" X/ O2 {$ N. M8 z, I' x: y+ ?

6 G+ U3 ~* ?' j, M4 L
解 决 思 路1 @) t6 a* i, a

8 @. B* ]4 Y" F- O* Y$ G
对于该问题,我们最先想到的是对原字节通过移位操作来逐位处理,使用另一个变量来存储交换后的结果。这种解决方案处理起来思路清晰,编写代码应该不难。
5 ~2 c4 \7 i. T" a- _
下面是该思路对应的代码:

5 S" m2 u, V* ^9 O
微信图片_20201105190623.png

  e/ {# u- \6 M- v5 {) z
上述代码实现起来不难,而且效率还是比较高的。

! g( C4 R( z- O' v) e
但是还有比这更简洁的解决方法,在嵌入式开发中遇到交换字节位的问题时,通常使用蝶式交换法和查表法来实现。查表法顾名思义即将一些值存到内存中,需要计算时查表即可,但是也会占用额外的存储空间。
( h" _9 O# V* I
这里主要再介绍一下蝶式交换法。
% y4 d  e  j( X8 R9 g/ b& i( Y
所谓的蝶式交换是这样的:

3 f: v  B6 a- {' m
微信图片_20201105190627.png
8 T$ H- w4 p7 j0 i1 F& _& ~& y- Q: N
我们可以做一下执行演算:
- y  d+ E9 {! `% q) s" b! c: ]8 [
假设原始位序列为  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 13 u2 h* h  X9 F* D
data=((data<<1)&0xaa)|((data>>1)&0x55);  之后序列为 1 0 0 1  1 0 1 0
! @5 e: E3 E. |0 F0 p0 f
更抽象的来说,原始位为 1 2 3 4  5 6 7 8
data=(data<<4)|(data>>4); 之后位序为  5 6 7 8  1 2 3 46 M4 ], ^9 \- a0 v+ ]4 W
data=((data<<2)&0xcc)|((data>>2)&0x33);   之后位序为  7 8 5 6  3 4 1 28 N( J4 H7 H; Z7 n" u
data=((data<<1)&0xaa)|((data>>1)&0x55);   之后位序为  8 7 6 5  4 3 2 1  
$ B2 w# w* E) T( z4 \4 {# t; _
由此完成了整个位的逆序转换,下面是具体的实现代码:

6 e  _4 I8 I% Y/ G. s3 V( T
微信图片_20201105190632.png
) i8 V+ X' @7 @3 ^& e

1 D1 w& O! Q: C: n7 s# u! _  A
结 语' Z/ J/ c* ^8 }( \3 p$ R" O
8 ~0 t/ d* w& h! ?( ^
交换字节的高低位并不是一个很常见的问题,遇到该问题时,需要经过仔细的分析,加上对C语言位操作的熟练掌握,就能够很好的解决这一类的问题。
% I8 q% l: S# P1 J) E" h
收藏 1 评论3 发布时间:2020-11-5 19:07

举报

3个回答
goyhuan 回答时间:2020-11-6 08:34:57
蝶式交换
西点钟灵毓秀 回答时间:2020-11-6 11:56:37
用位变量来解决不更香嘛?
" ^( c; A. _6 {" b7 X# g  C& Uunion sample
. N. z! O. R: G" ~/ z{+ A! Z$ s' Z( ]* z6 m& Y0 z1 g
struct err
& ~0 l  e/ A) w1 @0 V* v{
9 @0 m2 K* a. x3 Y/ h+ J& T* \unsigned char bit0 : 1;
0 x/ T( @  _& T9 ~unsigned char bit1 : 1;
. H8 T# @3 S9 y+ t7 F# p9 U0 j4 c" sunsigned char bit2 : 1;5 I7 P5 |. h& F  f) \5 L4 d
unsigned char bit3 : 1;
% L  k$ A# ?  R1 R+ wunsigned char bit4 : 1;( a7 ?: ~! W: D- t8 m& X; Z
unsigned char bit5 : 1;2 `# \; n' F" s
unsigned char bit6 : 1;' Y5 n/ n: P5 M( h
unsigned char bit7 : 1;
  h' T8 l" A! k  B4 |3 N5 Z1 T/ k} flag;, M  N) k2 R3 M5 I% q$ X2 y
unsigned char bit_all;9 m9 y7 D9 Q  J; r2 \6 d
}led;
zlutian 回答时间:2020-12-19 22:58:10
学习了,谢谢!

所属标签

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