字节循环移位——蝶式交换法
来源:互联网 发布:淘宝联盟ios版旧版本 编辑:程序博客网 时间:2024/05/14 06:52
问题
对一个字节数据,逐个交换其高低位,例如11010001,经过0-7,1-6,2-5,3-4对应位的交换,变成10001011 。
解决思路
对于该问题,我们最先想到的是对原字节通过移位操作来逐位处理,使用另一个变量来存储交换后的结果。这种解决方案处理起来思路清晰,编写代码应该不难。
下面是该思路对应的代码:
- unsigned char shift_fun1(unsignedchar data)
- {
- unsigned char i;
- unsigned char tmp=0x00;
- for(i=0;i<8;i++)
- {
- tmp=((data>>i)&0x01)|tmp;
- if(i<7)
- tmp=tmp<<1;
- }
- printf(" after shift fun1 data=%x \n",tmp);
- return tmp;
- }
上述代码实现起来不难,而且效率还是比较高的。但是还有比这更简洁的解决方法,在嵌入式开发中遇到交换字节位的问题时通常使用蝶式交换法和查表法来实现。查表法顾名思义即将一些值存到内存中,需要计算时查表即可,但是也会占用额外的存储空间。这里主要再介绍一下蝶式交换法。
所谓的蝶式交换是这样的:
- data=(data<<4)|(data>>4);
- data=((data<<2)&0xcc)|((data>>2)&0x33);
- data=((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
由此完成了整个位的逆序转换,下面是具体的实现代码:
- unsigned char shift_fun2(unsignedchar data)
- {
- data=(data<<4)|(data>>4);
- data=((data<<2)&0xcc)|((data>>2)&0x33);
- data=((data<<1)&0xaa)|((data>>1)&0x55);
- printf(" after shift fun2 data=%x \n",data);
- return data;
- }
总结
交换字节的高低位并不是一个很常见的问题,遇到该问题时,需要经过仔细的分析,加上对C语言位操作的熟练掌握,就能够很好的解决这一类的问题。
原文地址:http://blog.csdn.net/syzcch/article/details/8149706
- 字节循环移位——蝶式交换法
- 数据循环移位(左右区间交换)
- 编程之美——循环移位
- 记录代码——循环移位
- 字符串——循环移位包含问题
- 算法——字节高低位交换
- 算法——字节高低位交换
- 编程之美2.17——数组循环移位
- 编程之美——数组循环移位
- 编程之美3.1——字符串循环移位
- 华为机试——数组循环移位
- 《编程之美》——数组循环移位
- 华为机试——数循环移位
- 编程之美读书笔记2.17—数组循环移位
- 循环移位
- 循环移位
- 循环移位
- 循环移位
- C++ 运算符优先级列表
- 我们要完成哪些“软件”的更新——必须培养预见能力
- 《View Controller Programming Guide for iOS》笔记
- 开除员工 六个理由随便挑一个就够了
- 查找字符串中第一个只出现一次的字符
- 字节循环移位——蝶式交换法
- Java中String类的方法及说明
- 开启MYSQL日志,windows,慢查询
- AIX 平台上 Lotus Domino 语言包安装部署功能介绍
- myeclipse10.0优化
- mvc模式登陆代码
- Linux系统调用之creat函数
- 缓存
- Shell学习笔记(13)-流程控制之函数