大缓存区字节翻转的算法
大概100M的缓存区,要求得到翻转后的buf,即dest[end-i] = src[firt+i]
直接copy的方法首先就被淘汰,效率上太慢
想到每2,4,8字节翻转一次,copy一次
2字节: y = (x2>>8) | (x2<<8);
4字节: x = ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
y = (x>>16) | (x<<16);
8字节: x = ((x<<8)&0xFF00FF00FF00FF00) | ((x>>8)&0x00FF00FF00FF00FF);
x = ((x<<16)&0xFFFF0000FFFF0000) | ((x>>16)&0x0000FFFF0000FFFF);
y = (x>>32) | (x<<32)
大致核心就是每2/4/8的翻转算法
通过测试发现,4字节的效率是最高的,可能因为unsigned long long不是基本数据类型或者((x<<8)&0xFF00FF00FF00FF00) | ((x>>8)&0x00FF00FF00FF00FF)的效率问题。
汇编没尝试过
大家看看还有什么更好的方法没?
[解决办法]
1 折半 翻转试试!
2 为什么不在接收的的时候逆向存放在缓存里处理呢,
不过楼主 一下子100M的缓冲 ,这处理的,没有别的办法了?
[解决办法]
void DWORDReverseCopy(DWORD *pDest,const DWORD *pSrc,int iLength)
{
__asm
{
mov ecx,iLength
mov esi,pSrc
mov edi,pDest
L1:
lodsd
bswap eax
mov [edi+ecx*4-4],eax
dec ecx
jnz L1
}
}
按4字节翻转