0

在手写的地方使用 bitset 是否有任何性能损失/增益?

如何在运行时使用 bitset 构建以下内容

  • 将 2 到 5 之间的所有位设为零,即11110011.
4

3 回答 3

6

黄金法则:

不要过早优化!

在 99% 的情况下,Bitset足够快,并且具有作为一个通用概念的优势,因此它既更具可读性,又不易出现实现错误。不要简单地假设您的代码显然需要提高速度;使用 bitset 编写代码,分析您的应用程序,并查看是否:

  1. 它已经足够快了;和
  2. 如果速度不够快,它真的把大部分时间都花在了位操作上吗?

根据 80-20 规则,您可能会在更快地编写其他代码时获得更大的回报。嘿,如果事实证明您确实需要提高比特旋转速度,至少您有一些不错的基线数据可以使用,以表明您的解决方案确实比默认解决方案更快(无论如何您都需要)如果您想优化性能)。

于 2010-07-13T07:09:55.817 回答
1

您的第二个问题最简单的解决方案是使用另一个位集。

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 => 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;
}
于 2010-07-13T07:42:32.280 回答
0

对于像上面这样的简单示例,一个体面的手动编码解决方案将比使用 bitset 更快,但两种情况下的性能差异都会很小。

于 2010-07-13T06:53:19.590 回答