字节反转(字节颠倒)是一种经常用到的子程序,这里对常见的几种方法进行了对比,并进行了简单的测试。
// ---------------------------
// 方法1:用较小的查找表来实现
// 优点:在PC上执行时,速度很快,且占有空间很小
// 缺点:在MCU中执行,由于对数组的寻址,导致运算量很大
// ---------------------------
BYTE ByteInvert1( BYTE chSrc )
{
BYTE chInvTable[16] = { 0x00,
0x02, 0x0A, 0x06, 0x0E,
0x01, 0x09, 0x05, 0x0D,
0x03, 0x0B, 0x07, 0x0F };
BYTE chDst;
chDst = (chInvTable[chSrc&
chInvTable[chSrc>>4];
return chDst;
}
// ---------------------------
// 方法2:按位直接映射
// 优点:直观,高效
// 缺点:
// ---------------------------
BYTE ByteInvert2(BYTE chSrc )
{
BYTE chDst=0;
if ( chSrc & 0x80 ) chDst |=
if ( chSrc & 0x40 ) chDst |=
if ( chSrc & 0x20 ) chDst |=
if ( chSrc & 0x10 ) chDst |=
if ( chSrc & 0x08 ) chDst |=
if ( chSrc & 0x04 ) chDst |=
if ( chSrc & 0x02 ) chDst |=
if ( chSrc & 0x01 ) chDst |=
return(chDst);
}
// ---------------------------
// 方法3:逐位判断赋值
// 优点:直观,效率较高
// 缺点:代码较多
// ---------------------------
BYTE ByteInvert3( BYTE chSrc)
{
BYTE chDst;
chDst = chSrc&1;
chDst<<=1, chSrc>>= 1, chDst|
chDst<<=1, chSrc>>= 1, chDst|
chDst<<=1, chSrc>>= 1, chDst|
chDst<<=1, chSrc>>= 1, chDst|
chDst<<=1, chSrc>>= 1, chDst|
chDst<<=1, chSrc>>= 1, chDst|
chDst<<=1, chSrc>>= 1, chDst|
return chDst;
}
// ---------------------------
// 方法4:逐位判断赋值
// 优点:直观,代码较少
// 缺点:由于使用了循环,效率较低
// ---------------------------
BYTE ByteInvert4( BYTE chSrc )
{
BYTE i, chDst;
chDst = chSrc&1;
for( i=0; i<7; i++)
chDst<<=1, chSrc>>=1, chDst|
return chDst;
}
试验:
在MSP430中进行仿真试验,得到的数据如下:
------------------------------
方法 执行时间(周期数) 占用空间(字节)
------------------------------
方法1 219 62
方法2 33 68
方法3 49 92
方法4 103 32
结论:
从执行时间和占用空间两方面考虑,通常情况下,
补:
for (int t = 0; t < 8; t++) {
if(i & (1<<t))!=0) r|=(1<<(7-t));
else r&=~(1<<(7-t));
}
return r;