给定一个字节数组,如何创建一个字节,其中每个位都包含输入中该位置位的众数(平均值)值?

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 进行计数并以这种方式计算出来,但我希望有一种更优雅且可能更快的方法来完成它。

sel*_*bie 2

假设是bytesvector<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)

  • 请不要向读者扔一堆代码。解释算法背后的主要思想。 (2认同)