使用bitset代替使用手写位操作代码?

时间:2010-07-13 06:49:53

标签: c++ stl bit-manipulation bit bitset

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

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

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

3 个答案:

答案 0 :(得分:5)

黄金法则:

不要过早优化!

Bitset将在99%的情况下,快速足够,并且具有作为常见概念的优点,使得它更具可读性,并且更不容易出现实现错误。不要简单地假设您的代码显然需要提高速度;使用bitset编写代码,对应用程序进行概要分析,并查看是否:

  1. 它足够快;和
  2. 如果它不够快,是否真的花了大部分时间进行位操作?
  3. 根据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) -1X个序列。例如。 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更快,但两种情况下的性能差异都很小。