首页 > 编程知识 正文

c语言大端小端的转换编程,32位高低字节互换

时间:2023-05-03 10:52:49 阅读:135941 作者:823

问题

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

解决想法

对于这个问题,我们首先考虑的是对原来的字节通过移位操作逐位处理,用别的变量存储交换后的结果。 这个解决方案思路清晰,写代码应该不难。

以下是与此想法对应的代码。

[cpp]

unsignedcharshift _ fun1(unsignedchardata ) )。

{

无符号字符I;

unsigned char tmp=0x00;

for(I=0; i8; I )

{

tmp=(datai )0x01 )|tmp;

if(I7 ) )。

tmp=tmp1;

}

printf(aftershiftfun1data=%xn (,tmp );

return tmp;

}

上述代码不难实现,而且很高效。 但是,还有比这更简洁的解决方法,在嵌入式开发中出现字节位交换问题时,多采用蝶式交换法和查表法来实现。 查表法顾名思义,是将一些值保存在内存中。 需要计算的时候检查表就可以了,但是会消耗额外的存储空间。 这里主要介绍蝶式的交换方法。

蝶泳更换是指:

[cpp]

data=(|(data4)|) data4;

DATA=(data2)0xcc )|) ) data2)0x33;

DATA=(data1 )0xaa )|) data1 )0x55;

我们来做一个执行运算:

将原始比特序列设为0 1 0 1 1 0 0 1

data=(|(data4)|) data4; 之后的序列是1 0 0 1 0 1 0 1

DATA=(data2)0xcc )|) ) data2)0x33; 之后的序列是0 1 1 0 0 1 0 1

DATA=(data1 )0xaa )|) data1 )0x55; 之后的序列是1 0 0 1 1 0 1 0

更抽象地说,原始位是1 2 3 4 5 6 7 8

data=(|(data4)|) data4; 之后的名次是56781234

DATA=(data2)0xcc )|) ) data2)0x33; 之后的名次是7 8 5 6 3 4 1 2

DATA=(data1 )0xaa )|) data1 )0x55; 之后的名次是87654321

这样就完成了位整体的逆顺序变换。 具体的实现代码如下所示。

[cpp]

unsignedcharshift _ fun2(unsignedchardata ) )。

{

data=(|(data4)|) data4;

DATA=(data2)0xcc )|) ) data2)0x33;

DATA=(data1 )0xaa )|) data1 )0x55;

printf(aftershiftfun2data=%xn ),data );

返回数据;

}

总结

交换字节高低并不是常见的问题,遇到这个问题,只要有仔细的分析和熟练的C语言位操作,就能很好地解决这类问题。

3358 www.dengb.com/cjjc/519091.html www.dengb.com true http://www.dengb.com/cjjc/519091.htmltecharticle对问题的.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。