gpt4 book ai didi

c - 优化的字节数组移位器

转载 作者:太空宇宙 更新时间:2023-11-03 23:56:38 24 4
gpt4 key购买 nike

我确定之前有人问过这个问题,但我需要在可变长度大小的字节数组上实现一个移位运算符。我环顾四周,但没有找到任何标准的方法。我想出了一个可行的实现,但我不确定它的效率如何。有谁知道移动数组的标准方法,或者至少对如何提高我的实现性能有任何建议;

char* baLeftShift(const char* array, size_t size, signed int displacement,char* result)
{
memcpy(result,array,size);
short shiftBuffer = 0;
char carryFlag = 0;
char* byte;
if(displacement > 0)
{
for(;displacement--;)
{
for(byte=&(result[size - 1]);((unsigned int)(byte))>=((unsigned int)(result));byte--)
{
shiftBuffer = *byte;
shiftBuffer <<= 1;
*byte = ((carryFlag) | ((char)(shiftBuffer)));
carryFlag = ((char*)(&shiftBuffer))[1];
}
}
}
else
{
unsigned int offset = ((unsigned int)(result)) + size;
displacement = -displacement;
for(;displacement--;)
{
for(byte=(char*)result;((unsigned int)(byte)) < offset;byte++)
{
shiftBuffer = *byte;
shiftBuffer <<= 7;
*byte = ((carryFlag) | ((char*)(&shiftBuffer))[1]);
carryFlag = ((char)(shiftBuffer));
}
}
}
return result;
}

最佳答案

如果我可以补充@dwelch 所说的话,您可以试试这个。

  1. 只需将字节移动到它们的最终位置。然后,如果每个字节仍需要左移 3 位到下一个更高的字节,则剩下一个移位计数,例如 3。 (这假设在您的脑海中字节是从右到左按升序排列的。)

  2. 然后将每个字节向左旋转 3。查找表可能比单独进行实际旋转更快。然后,在每个字节中,要移动的 3 位现在位于字节的右端。

  3. 现在做一个面具M ,即 (1<<3)-1 , 这只是打开的低位 3 位。

  4. 现在,按照从高位字节到低位字节的顺序,执行以下操作:

    c[i] ^= M & (c[i] ^ c[i-1])

这会将位复制到 c[i]来自 c[i-1]面具下M .

对于最后一个字节,只需使用 0 代替 c[i-1] .

对于右移,同样的想法。

关于c - 优化的字节数组移位器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4464668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com