【问题标题】:BitField with number of flags as parameter以标志数为参数的位字段
【发布时间】:2014-01-23 19:38:58
【问题描述】:

假设我想创建一个带有二进制标志的类 BitField 和一个定义有多少个标志的构造函数:BitField bitField(500)。创建这样一个类的最佳方法是什么?如果我可以在偏移量处读取和设置标志并在位域getState(int index) const; 上执行按位运算,那就太酷了。谢谢!

【问题讨论】:

  • std::bitset<500>std::vector<bool>
  • 尝试编写自己的实现以用于学习目的。我知道这些。
  • 即便如此,这些就是答案。做别人做过的最好的方法是什么?像他们一样做事。
  • 当你不知道它是如何工作的时候,学习的意义何在?我想知道 bitset 是如何实现的。所以你的答案不是针对我的问题。
  • 您可以查看编译器附带的代码。这将向您展示它是如何在幕后工作的。

标签: c++ bit-fields


【解决方案1】:

如果要bitset,可以参考STL的实现。

【讨论】:

    【解决方案2】:

    这是我的建议(不包括实现本身):

    #include <limits.h>
    
    template<unsigned int SIZE>
    class BitField
    {
    public: //Constructors + Destructor
        BitField();
        virtual ~BitField();
        //-----------------------------------------------------------------------------
    public: //Assignment Operators
        virtual const BitField& operator=(const BitField& bitField);
        virtual const BitField& operator|=(const BitField& bitField);
        virtual const BitField& operator&=(const BitField& bitField);
        virtual const BitField& operator^=(const BitField& bitField);
        virtual const BitField& operator<<=(unsigned int shift);
        virtual const BitField& operator>>=(unsigned int shift);
        //-----------------------------------------------------------------------------
    public: //Unary Operators
        virtual BitField operator~() const;
        //-----------------------------------------------------------------------------
    public: //Binary Operators
        friend BitField operator|(const BitField& bitField1,const BitField& bitField2);
        friend BitField operator&(const BitField& bitField1,const BitField& bitField2);
        friend BitField operator^(const BitField& bitField1,const BitField& bitField2);
        virtual BitField operator<<(unsigned int shift) const;
        virtual BitField operator>>(unsigned int shift) const;
        //-----------------------------------------------------------------------------
    public: //Binary Comperators
        friend bool operator==(const BitField& bitField1,const BitField& bitField2);
        //-----------------------------------------------------------------------------
    protected:
        unsigned char m_flags[(SIZE-1)/CHAR_BIT+1];
    };
    

    注意:使用BitField&lt;500&gt; bitField 而不是BitField bitField(500) 来实例化对象。

    【讨论】:

    • virtual 不说,析构函数是不必要的。
    • @Mooing Duck:谢谢,但是如果 OP 选择添加其他字段,那么析构函数就变得必要了。如果 OP 进一步选择继承类,那么虚拟的析构函数也是必要的。简而言之,目的是定义一个可以在内部或通过继承进行扩展的泛型类。出于这个原因,所有成员函数都是virtual,所有成员变量都是protected而不是private(它也回答了上面@DeadMG提出的多余的冒犯性评论,尽管我认为没有理由与那个相关具体来说)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2021-08-05
    相关资源
    最近更新 更多