是否可以重载索引操作符[]以从整数返回位?

Is it possible to overload the indexing operator[] to return bits from an integer?

本文关键字:整数 返回 重载 索引 操作符 是否      更新时间:2023-10-16

我不确定这是否可能,因为据我所知,引用不能引用整数中的单个位,但我很想知道是否有一种技术可以实现以下效果。

int z = 0x1234;
z[0] = 1; //set the most significant bit of z.
uint8_t bit = z[30] //get the index 30 bit of z, counting from the left.

如果我不能有z[0] = 1,我想知道是否至少有可能能够使用重载操作提取位

不直接。您既可以在int上编写包装器,也可以使用std::bitset

不能重载内置类型的操作符。重载操作符必须至少包含一个用户定义的类型(即类或联合类型)。

如果你要包装int,你可以这样做:

class bitval {
    int &val;
    unsigned int mask;
  public:
    bitval(int &i, int idx) : val(i), mask(((unsigned int)(INT_MAX) + 1) >> idx) {}
    bitval &operator=(int i)  {
        if (i) {
            val |= mask;
        } else {
            val &= ~mask;
        }
        return *this;
    }
    operator bool() const {
        return val & mask;
    }
};
class bit {
    int &val;
  public:
    bit(int &i) : val(i) {}
    bitval operator[](int idx) { return bitval(val, idx); }
};

那么语法应该是:

int z = 0x1234;
bit(z)[0] = 1;
uint8_t b = bit(z)[30];
顺便说一句,c++程序员通常把最低有效位称为0位,而不是最高有效位,所以mask(1 << idx)可能会让他们不那么困惑。