首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过operator[]按位操作

通过operator[]按位操作
EN

Stack Overflow用户
提问于 2016-01-13 11:48:03
回答 1查看 92关注 0票数 1

我正在编写一个简单的位集包装器,以便轻松高效地设置、清除和读取8位整数中的位。我会通过operator[]完成这三个操作,但我被塞了下来,老实说,我不确定不可能不损失性能(对我的目的来说非常重要)。

代码语言:javascript
复制
#include <stdint.h>
#include <iostream>

class BitMask {
private:
    uint8_t mask;
public:
    inline void set(int bit) { mask |= 1 << bit; } // deprecated
    inline void clear(int bit) { mask &= ~(1 << bit); } // deprecated
    inline int read(int bit) { return (mask >> bit) & 1; } // deprecated
    bool operator[](int bit) const { return (mask >> bit) & 1; } // new way to read
    ??? // new way to write
    friend std::ostream& operator<<(std::ostream& os, const BitMask& bitmask) {
        for (int bit = 0; bit < 8; ++bit)
             os << ((bitmask.mask >> bit) & 1 ? "1" : "0");
        return os;
    }
};

int main() {
    BitMask bitmask1;
    bitmask1.set(3);
    bitmask1.clear(3);
    bitmask1.read(3);
    std::cout << bitmask1;

    BitMask bitmask2;
    bitmask2[3] = 1; // set
    bitmask2[3] = 0; // clear
    bitmask2[3]; // read
    std::cout << bitmask2;
}

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-13 11:56:08

单程(唯一的办法?)是从您的operator[]返回一个代理对象,该对象将为您的位保存索引,这样您将为您的代理对象分配新的值,这将改变适当的BitMask位。例如,请参见此处:Vector, proxy class and dot operator in C++

至于性能,这完全取决于编译器如何优化您的代码,如果您的代理类只有内联方法,那么它应该是快速的。

下面是如何修复代码的示例:

代码语言:javascript
复制
#include <stdint.h>
#include <iostream>

class BitMask {
private:
  uint8_t mask;
public:
  inline void set(int bit) { mask |= 1 << bit; } // deprecated
  inline void clear(int bit) { mask &= ~(1 << bit); } // deprecated
  inline int read(int bit) const { return (mask >> bit) & 1; } // deprecated

  struct proxy_bit
  {
    BitMask& bitmask;
    int index;
    proxy_bit(BitMask& p_bitmask, int p_index) : bitmask(p_bitmask), index(p_index) {}
    proxy_bit& operator=(int rhs) {
      if (rhs)
        bitmask.set(index);
      else
        bitmask.clear(index);
      return *this;
    }
    operator int() {
      return bitmask.read(index);
    }
  };

  proxy_bit operator[](int bit) { return proxy_bit(*this, bit); } // new way to read
  int operator[](int bit) const { return read(bit); } // new way to read

  friend std::ostream& operator<<(std::ostream& os, const BitMask& bitmask) {
    for (int bit = 0; bit < 8; ++bit)
      os << ((bitmask.mask >> bit) & 1 ? "1" : "0");
    return os;
  }
};

int main() {
  BitMask bitmask1;
  bitmask1.set(3);
  bitmask1.clear(3);
  bitmask1.read(3);
  std::cout << bitmask1 << std::endl;

  BitMask bitmask2;
  bitmask2[3] = 1; // set
  bitmask2[3] = 0; // clear
  bitmask2[3]; // read
  std::cout << bitmask2 << std::endl;

  const BitMask bitmask3;
  if (bitmask3[3]) {}
  //bitmask3[3] = 1; // compile error - OK!
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34765925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档