首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

大缓存区字节翻转的算法解决方案

2013-08-16 
大缓存区字节翻转的算法大概100M的缓存区,要求得到翻转后的buf,即dest[end-i] src[firt+i]直接copy的方

大缓存区字节翻转的算法
大概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字节翻转

热点排行