当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 碟式交换:C语言代码实现字节的高低位互换

碟式交换:C语言代码实现字节的高低位互换 时间:2021-03-21      来源:原创

问题

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

解决思路

对于该问题,我们最先想到的是对原字节通过移位操作来逐位处理,使用另一个变量来存储交换后的结果。这种解决方案处理起来思路清晰,编写代码应该不难。 下面是该思路对应的代码:
    1unsigned char shift_fun1(unsigned char data)  2{  3 unsigned char i;  4 unsigned char tmp=0x00;  5  6 for(i=0;i<8;i++)  7 {  8 tmp=((data>>i)&0x01)|tmp;  9 if(i<7) 10 tmp=tmp<<1; 11 } 12 13 printf("  after shift fun1 data=%x \n",tmp); 14 15 return tmp; 16 17}  
上述代码实现起来不难,而且效率还是比较高的。但是还有比这更简洁的解决方法,在嵌入式开发中遇到交换字节位的问题时通常使用 蝶式交换法 查表法来实现。查表法顾名思义即将一些值存到内存中,需要计算时查表即可,但是也会占用额外的存储空间。这里主要再介绍一下蝶式交换法。
所谓的蝶式交换是这样的:
   1data=(data<<4)|(data>>4); 2data=((data<<2)&0xcc)|((data>>2)&0x33); 3data=((data<<1)&0xaa)|((data>>1)&0x55);  
我们可以做一下执行演算:
假设原始位序列为
0 1 0 1 1 0 0 1data=(data<<4)|(data>>4);之后序列为 1 0 0 1 0 1 0 1data=((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
由此完成了整个位的逆序转换,下面是具体的实现代码:
   1unsigned char shift_fun2(unsigned char data) 2{ 3 data=(data<<4)|(data>>4); 4 data=((data<<2)&0xcc)|

上一篇: STM32单片机外部晶振无效?那是因为配置不对?

下一篇:C语言编程建议和技巧,同样适用于单片机的学习

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部