字节反转(字节颠倒)是一种经常用到的子程序,这里对常见的几种方法进行了对比,并进行了简单的测试。 

// ---------------------------------------------------------  
// 方法1:用较小的查找表来实现  
// 优点:在PC上执行时,速度很快,且占有空间很小  
// 缺点:在MCU中执行,由于对数组的寻址,导致运算量很大  
// ---------------------------------------------------------  
BYTE ByteInvert1( BYTE chSrc )  
{  
 BYTE chInvTable[16] = { 0x00, 0x08, 0x04, 0x0C,  
    0x02, 0x0A, 0x06, 0x0E,  
    0x01, 0x09, 0x05, 0x0D,  
    0x03, 0x0B, 0x07, 0x0F };  
 BYTE chDst;  
   
 chDst = (chInvTable[chSrc&0x0F] << 4) +  
  chInvTable[chSrc>>4];  
     
 return chDst;  
}  
// ---------------------------------------------------------  
// 方法2:按位直接映射  
// 优点:直观,高效  
// 缺点:  
// ---------------------------------------------------------  
BYTE ByteInvert2(BYTE chSrc )  
{   
 BYTE chDst=0;  
   
 if ( chSrc & 0x80 ) chDst |= 0x01;   
 if ( chSrc & 0x40 ) chDst |= 0x02;   
 if ( chSrc & 0x20 ) chDst |= 0x04;  
 if ( chSrc & 0x10 ) chDst |= 0x08;  
 if ( chSrc & 0x08 ) chDst |= 0x10;  
 if ( chSrc & 0x04 ) chDst |= 0x20;   
 if ( chSrc & 0x02 ) chDst |= 0x40;   
 if ( chSrc & 0x01 ) chDst |= 0x80;  
   
 return(chDst);  
}   
// ---------------------------------------------------------  
// 方法3:逐位判断赋值  
// 优点:直观,效率较高  
// 缺点:代码较多  
// ---------------------------------------------------------  
BYTE ByteInvert3( BYTE chSrc)  
{  
 BYTE chDst;  
   
 chDst = chSrc&1;  
   
 chDst<<=1, chSrc>>= 1, chDst|=chSrc&1;  
 chDst<<=1, chSrc>>= 1, chDst|=chSrc&1;  
 chDst<<=1, chSrc>>= 1, chDst|=chSrc&1;  
 chDst<<=1, chSrc>>= 1, chDst|=chSrc&1;  
 chDst<<=1, chSrc>>= 1, chDst|=chSrc&1;  
 chDst<<=1, chSrc>>= 1, chDst|=chSrc&1;  
 chDst<<=1, chSrc>>= 1, chDst|=chSrc&1;  
   
 return chDst;  
}  

// ---------------------------------------------------------  
// 方法4:逐位判断赋值  
// 优点:直观,代码较少  
// 缺点:由于使用了循环,效率较低  
// ---------------------------------------------------------  
BYTE ByteInvert4( BYTE chSrc )  
{  
 BYTE i, chDst;  
   
 chDst = chSrc&1;  
   
 for( i=0; i<7; i++)  
  chDst<<=1, chSrc>>=1, chDst|=chSrc&1;         
   
 return chDst;  
}  

试验:  
 在MSP430中进行仿真试验,得到的数据如下:  
---------------------------------------------------------  
   方法  执行时间(周期数) 占用空间(字节)  
---------------------------------------------------------  
  方法1      219       62  
  方法2       33       68  
  方法3       49       92  
  方法4      103       32  
结论:  
 从执行时间和占用空间两方面考虑,通常情况下,在MCU中最好采用方法2。在PC上,或是在执行时间、占有空间上有特殊要求的情况下,则另当别论。
 
补:
for (int t = 0; t < 8; t++) {
 if(i & (1<<t))!=0) r|=(1<<(7-t));
 else r&=~(1<<(7-t));
}
return r;