问题
对于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对问题的.