代码之家  ›  专栏  ›  技术社区  ›  yesraaj

使用位集代替手写的位操作代码?

  •  0
  • yesraaj  · 技术社区  · 14 年前

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

    • 11110011
    3 回复  |  直到 14 年前
        1
  •  1
  •   MSalters    14 年前

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

    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 因此,(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
  •  6
  •   Andrzej Doyle    14 年前

    黄金法则:

    不要过早地优化!

    位集在99%的情况下都会很快 ,并且具有作为一个通用概念的优点,因此它更具可读性,并且不容易出现实现错误。不要简单地假设你的代码显然需要提高速度;使用位集编写代码,分析应用程序,然后查看是否:

    1. 它已经够快了;和

    根据80-20法则,你很有可能在更快地编写其他代码时获得更大的回报。嘿,如果你真的需要提高比特旋转的速度,至少你有一些像样的基线数据可以用来显示你的r解决方案真的比默认的要快(如果你想优化性能,无论如何你都需要这个)。

        3
  •  0
  •   Will A    14 年前

    对于上面这样一个简单的例子,一个像样的手工编码解决方案将比使用位集更快,但是在这两种情况下的性能差异都很小。