gpt4 book ai didi

c++ - 在 char 数组中查找最多 6 个连续 0 位的最快方法

转载 作者:可可西里 更新时间:2023-11-01 17:38:16 26 4
gpt4 key购买 nike

这是我目前正在做的:

int dataLen = 500;
char data[dataLen];
int desired = 1; // between 1 and 6, inclusive
...
char bits[dataLen * 8];
for (int32 j = 0; j < dataLen; j++) {
for (int i = 0; i < 8; i++) {
bits[j*8+i] = ( (data[j] & (1 << (7-i))) ? '1' : '0' );
}
}
int offset = std::search_n(bits, bits + dataLen*8, desired, '0') - bits;

我知道这真的很讨厌,而且它会降低性能。

找到第一组x 的位偏移的最快方法是什么? char 数组中的连续 0 位,其中 0 < x < 7 ?我在 GCC 上使用 SSE 4.2,所以像 __builtin_ctz、__builtin_popcountl 这样的内置函数是一个选项,我只是想不出使用它们的最佳方式。

最佳答案

有多少个数字有 6 个连续的 0 位(即使考虑 2 个连续的字节)?

Byte 1
XXXXXXXX
000000?? 0/1/2/3
?000000? 0/1/128/129
??000000 0/64/128/192

所以如果我们一次考虑 1 个字节,那么 0/1/2/3/64/128/192

Byte a   Byte b
XXXXXXXX XXXXXXXX
??100000 0??????? (a & 31 == 0) && (b & 128 == 0)
???10000 00?????? (a & 15 == 0) && (b & 192 == 0)
????1000 000????? (a & 7 == 0) && (b & 224 == 0)
?????100 0000???? (a & 3 == 0) && (b & 240 == 0)
??????10 00000??? (a & 1 == 0) && (b & 248 == 0)

因此,绝对最多 12 次测试可为您提供所有组合。
我敢肯定,如果您巧妙地进行比较,就可以减少这种情况。

如果我们在下面使用表驱动方法钢化@Michael Burr 解决方案。然后我们可以组织它,以便您可以每个字节进行一到两次比较。

struct TestStruct
{
bool is6Consecutive;
bool hasTrailing;
int maskNextByte;
int offset;
};
TestStruct testData[256];

std::size_t findOffsetOf_6ConsecutiveZero(char const* data, size_t size)
{
for(int loop = 0;loop < (size-1); ++loop)
{
char const& val = data[loop];
TestStructure const& test = testData[val];

if (test.is6Consecutive)
{ return loop*8 + test.offset;
}

if (test.hasTrailing)
{
if ((data[loop + 1] & test.maskNextByte) == 0)
{ return loop*8 + test.offset;
}
}
}
// Test last byte
TestStructure const& test = testData[data[size-1]];
if (test.is6Consecutive)
{ return (size-1)*8 + test.offset;
}

return -1;
}

前几个表格条目:

TestStruct   testData[256] =
{
{true, false, 0x00, 0},
{true, false, 0x00, 0},
{true, false, 0x00, 0},
{true, false, 0x00, 0},
{false, true, 0xf0, 6}, // 4 => 00000100 <Next 4 bytes are zero we hit>
{false, false, 0x00, 0}, // 5 => 00000101 <Ignore and move on>
{false, true, 0xf8, 7}, // 6 => 00000110 <Next 5 bytes are zero we hit>
etc...

};

关于c++ - 在 char 数组中查找最多 6 个连续 0 位的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13116310/

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