在手写的地方使用bitset是否有任何性能损失/增益?
如何在运行时使用bitset构建以下内容
11110011
。答案 0 :(得分:5)
黄金法则:
不要过早优化!
Bitset将在99%的情况下,快速足够,并且具有作为常见概念的优点,使得它更具可读性,并且更不容易出现实现错误。不要简单地假设您的代码显然需要提高速度;使用bitset编写代码,对应用程序进行概要分析,并查看是否:
根据80-20规则,你可能会获得更高的回报,使其他代码更快。嘿,如果事实证明你确实需要提高比特速度,至少你有一些不错的基线数据来表明你的解决方案确实比默认更快(你还需要它)如果你想优化性能)。
答案 1 :(得分:1)
第二个问题的最简单解决方案是使用另一个bitset。
void makebitszero(bitset<8>& b) {
// Everything but bits 3 and 4 (between 2 and 5).
static const bitset<8> mask = ~bitset<8>(12);
b &= mask;
}
给定两位位置mask
的表达式需要一些数学计算。
[编辑]
好的,这是数学。诀窍是(1UL << X) -1
是X
个序列。例如。 3 =&gt; 00000111。
因此,(1 <5) - (1 <3)= 00011111-00000111 -1 + 1 = 00011000(位3和4)。因此在代码中:
template<int i, int j, int N>
void makeBitsZero(bitset<N>& b) {
// Everything from bit i up to but not including bit j (i < j)
static const bitset<N> mask = ~bitset<N>(1UL<<j) - (1UL<<i));
b &= mask;
}
答案 2 :(得分:0)
对于如上所述的简单示例,一个不错的手工编码解决方案将比使用bitset更快,但两种情况下的性能差异都很小。