【发布时间】:2016-07-04 11:46:01
【问题描述】:
我想计算1 在同一位置的多个位集中的出现次数。每个位置的计数存储在一个向量中。
例如
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;
}
}
}
【问题讨论】:
-
忘记了这个在线编译器link
-
一些事情: 1. 为什么使用
std::vector而不是std::array,因为您所有的位集都有编译时常量大小?如果您需要std::vector,请使用正确的大小对其进行初始化,而不是使用push_back。 2. 通过交换两个循环(使内循环成为外循环),您可能会更快一些 - 这样可以避免多次加载同一块内存。 -
你真的需要
std::bitset<>吗?如果没有,为什么不使用一个简单的 char 并将二进制文件放入其中并进行一些简单的低级位操作? -
[OT] 您可以编辑以添加链接而不是添加评论。
-
std::bitset<N>存储在向量中,因为我不知道编译时的大小。进一步std::bitset<N>用于执行逻辑操作。
标签: c++ stdvector std-bitset