Ver*_*non 8 c++ bit-manipulation average
我正在尝试找出快速简便的方法来查找字节数组中每个位的模式(“平均值”)。
这是我正在寻找的示例:
Byte 1 1010 1010
Byte 2 0101 0101
Byte n 1010 1000
Run Code Online (Sandbox Code Playgroud)
Result 1010 1000
Run Code Online (Sandbox Code Playgroud)
因此,如果位位置主要包含 1,则答案中的位位置为 1。如果位位置主要包含 0,则答案为 0。如果 1 和 0 出现次数相同,那么我不在乎放入什么值在答案中的那个位置。
对于我的用例来说,输入数量的数量级很小(大约 10 到 20 个输入),但欢迎讨论您的方法的性能,因为它随输入数量而扩展。
我可以手动对每个 1 和每个 0 进行计数并以这种方式计算出来,但我希望有一种更优雅且可能更快的方法来完成它。
假设是bytes或vector<uint8_t>。array<uint8_t>
保留一个名为counts8 个整数的表,全部初始化为 0。伪代码:
For each byte B in the input set of bytes
for each bit b at index i in B
if b is set:
counts[i]++
Run Code Online (Sandbox Code Playgroud)
然后使用counts构建最终结果:
vector<int> counts(8);
uint8_t result = 0;
for (uint8_t b : bytes)
{
uint8_t mask = 0x80;
size_t needed = (bytes.size() +1) / 2;
for (size_t i = 0; i < 8; i++)
{
counts[i] += (mask & b) ? 1 : 0;
if (counts[i] >= needed)
{
result = mask | result;
}
mask = mask >> 1;
}
}
std::cout << "Result: " << result << "\n";
Run Code Online (Sandbox Code Playgroud)