问题

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

解决思路

对于该问题,我们最先想到的是对原字节通过移位操作来逐位处理,使用另一个变量来存储交换后的结果。这种解决方案处理起来思路清晰,编写代码应该不难。

下面是该思路对应的代码:

[cpp]

unsigned char shift_fun1(unsigned char 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;

}

上述代码实现起来不难,而且效率还是比较高的。但是还有比这更简洁的解决方法,在嵌入式开发中遇到交换字节位的问题时通常使用蝶式交换法和查表法来实现。查表法顾名思义即将一些值存到内存中,需要计算时查表即可,但是也会占用额外的存储空间。这里主要再介绍一下蝶式交换法。

所谓的蝶式交换是这样的:

[cpp]

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

由此完成了整个位的逆序转换,下面是具体的实现代码:

[cpp]

unsigned char shift_fun2(unsigned char 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://www.dengb.com/cjjc/519091.htmlwww.dengb.comtruehttp://www.dengb.com/cjjc/519091.htmlTechArticle问题 对一个字节数据,逐个交换其高低位,例如11010001,经过0-7,1-6,2-5,3-4对应位的交换,变成10001011 。 解决思路 对于该问题,我们最...

c语言怎么把字节的高低位互换,算法——字节高低位交换相关推荐

  1. java 二进制 2个字节 高位 低位_高位字节、低位字节

    一般一个16位(双字节)的数据,比如 FF1A  (16进制) 那么高位字节就是FF,低位是1A 如果是32位的数据,比如  3F68415B 高位字(不是字节)是3F68 低位字是415B 右边是低 ...

  2. java 二进制 2个字节 高位 低位_高位字节,低位字节应该怎么理解

    一般一个16位(双字节)的数据,比如 FF1A (16进制) 那么高位字节就是FF,低位是1A 如果是32位的数据,比如 3F68415B 高位字(不是字节)是3F68 低位字是415B 右边是低位位 ...

  3. 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)

    本文首发于 2014-07-21 15:32:28 1. 引言 考虑下面的结构体定义: typedef struct{char c1;short s; char c2; int i; }T_FOO; ...

  4. 编写一个程序,实现将存放在AX和DX中的32位数据循环右移二进制数的4位。(DX存放高字节内容,AX存放低字节内容)

    编写一个程序,实现将存放在AX和DX中的32位数据循环右移二进制数的4位.(DX存放高字节内容,AX存放低字节内容) P151 例4.9 汇编思路: AX右移四位后,使用BH接收AL的低四位数据,得到 ...

  5. 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...

  6. c语言比较函数memcmp,c语言函数memcmp()如何比较内存前n个字节实例源码介绍

    c语言函数memcmp()如何比较内存前n个字节实例源码介绍.引入头文件:#include 定义memcmp()函数:int memcmp (const void *s1, const void *s ...

  7. R语言贝叶斯方法在生态环境领域中的高阶技术

    贝叶斯统计学即贝叶斯学派是一门基本思想与传统基于频率思想的统计学即频率学派完全不同的统计学方法,它在统计建模中具有灵活性和先进性特点,使其可以轻松应对复杂数据和模型结构. 然而,很多初学者在面对思想. ...

  8. c语言指针类型占多少字节,关于指针占多少个字节

    开章明义,在32位系统中指针占四个字节: 说道这个问题,学过C语言的都知道,我们在定义一个指针的时候需要说明指针的类型,那么按道理来说,不同类型的指针大小应该不同啊,整形占四个字节,浮点占八个字节,其 ...

  9. c语言比特和字节,详解 比特(位,bit),字节(Byte),字符的区别 *(转)

    比特(位):英文bit,是计算机晶体管的一种状态(通电与断电).就是0与1,真与假,是计算机最基本的传输单位. 示例: 2bit : 10; 4bit : 1111; 8bit : 1111 1111 ...

最新文章

  1. 【ionic App问题总结系列】ionic 如何更新app版本
  2. python分析nginx日志
  3. 仅对此用户禁用 java_Spring Security实现禁止用户重复登陆的配置原理
  4. Centos7 Docker镜像操作_入门试炼02
  5. oracle 9i hwm,Oracle 10g HWM原理及性能优化
  6. Linux 中最常用 150 个命令汇总
  7. C#中声明、调用和配置事件的演示源码
  8. 群体智能之蜘蛛猴优化算法(SMO)
  9. ArcGIS 可视性分析
  10. 程序员毕业实习报告,5000字
  11. java微信公众号扫码登录对接流程
  12. 百钱买百鸡,公鸡五元一只,母鸡三元一只,小鸡一元三只
  13. AutoCAD套合(叠加)卫星影像和矢量路网数据-CAD配准
  14. Java API--IO流整理
  15. 解决container_linux.go:262: starting container process caused:
  16. 有个程序员男朋友是什么样的体验
  17. 5W1H分析法 什么是5W1H分析法?
  18. SpringBoot通过logback将日志写到本地文件里面
  19. C++模板类声明和定义几种写法
  20. 【win8系统开机自动拨号连接宽带图文教程】

热门文章

  1. 关于魏则西事件——听听来自百度的声音
  2. 高血压,注意什么,预防
  3. php168源码讲解,hph168 - WEB源码|源代码 - 源码中国
  4. Discuz!论坛Tools工具箱功能详解
  5. 团队拓扑:在云原生时代,如何定位自身与团队?
  6. VC创建进程CreateProcess的方法
  7. 一文弄懂Python中的 if __name__ == __main__
  8. 2021年最新前端面试题(js,vue,webpack,css,react)总结
  9. TypeError: bad operand type for unary +: 'str'
  10. 第十四届华中科技大学程序设计竞赛-L—Fresh Air,bfs拓展,倒着bfs