嵌入式开发中字节高低位转换如何实现_第1页
嵌入式开发中字节高低位转换如何实现_第2页
嵌入式开发中字节高低位转换如何实现_第3页
嵌入式开发中字节高低位转换如何实现_第4页
嵌入式开发中字节高低位转换如何实现_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页嵌入式开发中字节高低位转换如何实现蝶式交换。

问题是这样子的:

协议要求字节低位在左,高位在右,对每个字节做转换处理,逐个交换其高低位,例如11010001,经过0->7,1->6,2->5,3->4对应位的交换,变成10001011。

这里就需要有位操作的知识,参考位操作运算有什么技巧?(附源码)

这里我们以8位数据高低位转换为例子:

1#include

23unsigned

char

highAndLowShiftHEX(unsigned

char

data);4void

printBin(int

n);56int

main

()

{78

highAndLowShiftHEX(209);9

return

0;10}1112unsigned

char

highAndLowShiftHEX(unsigned

char

data)

13{

14

unsigned

char

i;

15

unsigned

char

tmp=0x00;

16

f(or)(i=0;i>i)

19

//printBin(tmp);20

if(i=

0;

i

--)//略去高位0.39

{40

if(n41

}4243

for(;i>=0;

i

--)44

printf("%d",

(n45}

熟悉位操作,上述代码实现起来就比较简单。在(嵌入式开发)中这类问题通常使用蝶式交换法和查表法来实现。

高阶实现?

查表法就是将一些值存到内存中,在需要计算的时候查表,但是这种方法会占用额外的存储空间。

所以这里主要介绍一下蝶式交换法,我们以8位数据转换为例。

假设原始序列为:12345678

目标序列为:87654321

那么流程图如下:

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

1#include

23unsigned

char

highAndLowShiftHEX(unsigned

char

);4void

printBin(int

);56int

main

()

{78

highAndLowShiftHEX(209);9

return

0;10}1112unsigned

char

highAndLowShiftHEX(unsigned

char

data)

13{

14

data=(data>4);

15

data=((data=

0;

i

--)//略去高位0.33

{34

if(n35

}3637

for(;i>=0;

i

--)38

printf("%d",

(n39}

交换字节的高低位并不是一个很常见的问题,遇到该问题时,需要经过仔细的分析,加上对(C语言)位操作的熟练掌握,就能够很好的解决这一类的问题。

扩展

那么,我们将其扩展到16位半字数据的高低位转换。

其实原理是跟8位的时候是一样的,采用简单的移位方式对数据的高低位进行转换。熟悉位操作的话代码就相对简单了。

下面是对该思路的具体实现:

1#include

23void

expandPrintBin(int

val2);4unsigned

short

HighAndLowSwitchHEX(unsigned

short

data);56int

main

()

{78

HighAndLowSwitchHEX(38491);9

return

0;10}111213//由于二进制直观,故写了一个扩展的打印二进制的函数14void

expandPrintBin(int

val2)15{16

int

i,k;17

unsigned

char

*p

=

(unsigned

char*)

//从低位到高位,低端字节计算机18

for(

k

=

0;

k

=

0;

i--)22

{23

if(val2

25

else26

printf("0");27

}28

printf("

");29

}30}31unsigned

short

HighAndLowSwitchHEX(unsigned

short

data)32{33

unsigned

char

i

=

0;34

unsigned

short

temp

=

0x0000;3536

for(i

=

0;

i

>

i)

39

if(i

abcdefghijklmnop

目标序列为:ponmlkjihgfedcba

流程图如下所示:

由此完成了整个位的逆序转换,完成了(算法)的拓展,以1001011001011011为例,下面是具体的实现代码:

1#include

23unsigned

short

highAndLowShiftHEX(unsigned

short

data);4void

expandPrintBin(int

val2);56int

main

()

{78

highAndLowShiftHEX(38491);9

return

0;10}1112unsigned

short

highAndLowShiftHEX(unsigned

short

data)13{14

data

=

(data

>

8);

//010110111001011015

data

=

((data

=

0;

i--)32

{33

if(val2

35

else36

printf("0");37

}38

printf("

");39

}4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论