碟式交换:C语言代码实现字节的高低位互换

问题

对一个字节数据,逐个交换其高低位,例如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 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
由此完成了整个位的逆序转换,下面是具体的实现代码:
1unsigned char shift_fun2(unsigned char data)  
2{  
3    data=(data<<4)|(data>>4);  
4    data=((data<<2)&0xcc)|((data>>2)&0x33);  
5    data=((data<<1)&0xaa)|((data>>1)&0x55);  
6    printf('  after shift fun2 data=%x \n',data);  
7
8    return data;  
9}
(0)

相关推荐

  • 把十进制数转换成十六进制后如何分割高低字节

    把十进制数转换成十六进制后分割成高低字节 #include 'stdafx.h' #include <stdio.h> void main()  { unsigned int angle ...

  • I2c通讯介绍及代码演示

    https://m.toutiao.com/is/dtQX1Pt/?=I2c通讯介绍及代码演示 I2c通讯介绍及代码演示 1.启动和停止波形图 2.程序 就SDA有区别 启动 停止 Sda=1 Sda ...

  • 嵌入式开发中自定义协议的解析与组包

    在嵌入式产品开发中,经常会遇到两个设备之间的通信.设备与服务器的通信.设备和上位机的通信等,很多时候通信协议都是自定义的,所以就涉及到自定义协议的解析和组包问题. 比如针对下面的这样一个协议: 帧头1 ...

  • C语言:如何用更高层次编写嵌入式C代码

    摘要:本文首先分析了C语言的陷阱和缺陷,对容易犯错的地方进行归纳整理:分析了编译器语义检查的不足之处并给出防范措施,以Keil MDK编译器为例,介绍了该编译器的特性.对未定义行为的处理以及一些高级应 ...

  • 这组对比式小标题语言精美、道理深刻

    摘取好提纲与各位读友交流,帮助大家打开思维之门,原来小标题还能这样拟!今天推荐给各位读友的好提纲是,3月30日,建湖委书记.县长祁从峰在全县青年干部座谈会上,与全县各条线.各领域的青年干部代表座谈时的 ...

  • PQ M语言代码不是写出来的,是改出来的——写在M开篇之前

    小勤:PowerQuery的M语言好可怕啊,随随便便都是一长串的东东,看着都晕菜了!怎么学得来啊! 大海:哈哈,你觉得这是正常人类能写出来的吗? 小勤:恐怕不能吧,反正我是觉得学一辈子估计都写不出来. ...

  • 大金冷式水冷机故障代码

    大金中央空调其实有好多种,也不知道你具体要多少 现在 我把我知道的都告诉你 吧 希望能帮到你 大金中央空调CUW420D5Y 大金单螺杆冷水机组水冷系列CUW系列 大金中央空调CUW100DS5Y-H ...

  • 听说,高手都用记事本写C语言代码?

    坊间传闻高手都喜欢用记事本写代码,那么问题来了,我们以C语言为例,如何用记事本编译运行呢? 其实,最简单的方式就是安装GCC编译器,在记事本编写C语言程序,然后再在命令行用GCC编译运行. 下面,简单 ...

  • 【C语言训练】求具有abcd=(ab+cd)2性质的四位数 (C语言代码)

    作者: Galaxy 发表时间:2021-02-26 01:02:17 原题链接:[C语言训练]求具有abcd=(ab+cd)2性质的四位数 解题思路: 对于每个要验证的四位数abcd,我们只需要截出 ...

  • 碟式制动器的维护与保养方法

    制动器是电梯中最重要的安全和保障的部件,安装于电动机旁边,在电动机轴与蜗杆轴相连的制动轮处,在电梯停站时保持电梯轿厢的静止状态,当电梯发生故障时使轿厢能够紧急减速停车并保持其静止状态的一种装置.有分析 ...

  • rpy2库 | 在jupyter中调用R语言代码

    在数据分析中,Python和R各有千秋,虽然Python或R都能在数据分析打通关,从采集.清洗(预处理).分析.可视化,但是在不同的环节,不同的语言易用程度不同.Python胜在干脏活累活,诸如数据采 ...

  • R语言代码相关疑问标准提问

    关于如何提问,如何高效沟通,其实我们讲解了非常多了,比如我一直推崇的邮件交流:如果你希望我回答你的问题 ,然后也会随机抽取粉丝提问进行解答:答读者问第一弹:R里面差异分析的limma包用法细节 .也高 ...