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

// --------------------------------------------------------- 
// 方法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;