字节处理的问题 请问各位高手:如何将一个字节中的8个比特位的数据倒置。就是第8位变成第1位,第7位变成第2位。如01101001变成10010110如有多种做法,哪种做法最快! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 字节反转(字节颠倒)是一种经常用到的子程序,这里对常见的几种方法进行了对比,并进行了简单的测试。 // --------------------------------------------------------- // 方法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上,或是在执行时间、占有空间上有特殊要求的情况下,则另当别论。 stevecrisewu(月亮骑士) :你太伟大了.无限个感谢送给你!当然,稍后会有分送出.再一次感谢. 多线程执行问题,急求回答,谢谢! 在vs2008中添加一个IDispatch的借口 关于单文档视图自动滚屏的问题 改变其他应用的窗口形状 老外的用词我有点迷茫,大家帮忙看看,最高只能给90了 大手大脚之子类化问题 关于MFC的框架,怎样得到全局的theApp的地址 我在单文档中嵌入了一个对话框,能否在菜单中关闭此对话框,再嵌入另一个对话框? 高手快进~~一个不容易理解的问题!我敢保证80%的人没遇到过。 怎么在一个窗口内同时载入两幅至三幅的图片,每张图片都有一个滚动条 在线程中使用对话框的问题 求书!MXX,SEE,SEE2的书
// 方法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上,或是在执行时间、占有空间上有特殊要求的情况下,则另当别论。
你太伟大了.无限个感谢送给你!
当然,稍后会有分送出.
再一次感谢.