我不确定这是否可能,因为据我所知,引用不能引用整数中的各个位,但我很想知道是否有一种技术可以实现以下效果。
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 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
.
您不能为内置类型重载运算符。重载的运算符必须包含至少一种用户定义的类型(即类或联合类型)。
如果你要 wrap 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)
可能会让他们不那么困惑。