gpt4 book ai didi

c++ - 计算多个 std::bitset 中出现 1 的最快方法?

转载 作者:行者123 更新时间:2023-11-28 05:36:31 26 4
gpt4 key购买 nike

我想计算 1 在同一位置的多个位集中的出现次数。每个位置的计数存储在一个 vector 中。

例如

b0 = 1011
b1 = 1110
b2 = 0110
----
c = 2231 (1+1+0,0+1+1,1+1+1,1+0+0)

我可以用下面的代码轻松做到这一点,但这段代码似乎缺乏性能,但我不确定。所以我的问题很简单:有没有更快的方法来计算 1

#include <bitset>
#include <vector>
#include <iostream>
#include <string>

int main(int argc, char ** argv)
{
std::vector<std::bitset<4>> bitsets;
bitsets.push_back(std::bitset<4>("1011"));
bitsets.push_back(std::bitset<4>("1110"));
bitsets.push_back(std::bitset<4>("0110"));

std::vector<unsigned> counts;

for (int i=0,j=4; i<j; ++i)
{
counts.push_back(0);
for (int p=0,q=bitsets.size(); p<q; ++p)
{
if (bitsets[p][(4-1)-i]) // reverse order
{
counts[i] += 1;
}
}
}

for (auto const & count: counts)
{
std::cout << count << " ";
}
}

for (int i=0,j=4; i<j; ++i)
{
for (int p=0,q=b.size(); p<q; ++p)
{
if(b[p][i])
{
c[p] += 1;
}
}
}

最佳答案

表驱动方法。它显然有其局限性*,但根据应用程序可能证明非常合适:

#include <array>
#include <bitset>
#include <string>
#include <iostream>
#include <cstdint>

static const uint32_t expand[] = {
0x00000000,
0x00000001,
0x00000100,
0x00000101,
0x00010000,
0x00010001,
0x00010100,
0x00010101,
0x01000000,
0x01000001,
0x01000100,
0x01000101,
0x01010000,
0x01010001,
0x01010100,
0x01010101
};

int main(int argc, char* argv[])
{
std::array<std::bitset<4>, 3> bits = {
std::bitset<4>("1011"),
std::bitset<4>("1110"),
std::bitset<4>("0110")
};

uint32_t totals = 0;

for (auto& x : bits)
{
totals += expand[x.to_ulong()];
}

std::cout << ((totals >> 24) & 0xff) << ((totals >> 16) & 0xff) << ((totals >> 8) & 0xff) << ((totals >> 0) & 0xff) << std::
endl;
return 0;
}

编辑::* 实际上,它没有人们想象的那么有限......

关于c++ - 计算多个 std::bitset<N> 中出现 1 的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38183963/

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