我听了某个节目主持人的评论
至于您的问题,如果您想要一个既可以作为本机uint8\t又可以以“好”的方式处理位的类型,那么您必须自己实现这样一个类。如果您需要它映射到内存映射硬件寄存器,它可能应该包装一个指向寄存器的指针。
#include <cassert>
#include <iostream>
#include <iomanip>
class ByteReg {
private:
volatile uint8_t ®
public:
explicit ByteReg(volatile uint8_t ®): reg(reg) { }
ByteReg(const ByteReg&) = delete;
ByteReg operator=(const ByteReg&) = delete;
~ByteReg() = default;
operator uint8_t() { return reg; }
bool test(int i) const
{
assert(i >= 0 && i < 8);
return ((reg >> i) & 1) != 0;
}
};
int main()
{
volatile uint8_t hwReg = 0xaa; // 0x10101010
ByteReg reg(hwReg);
unsigned value = reg;
std::cout << "reg: 0x" << std::hex << std::setw(2) << std::setfill('0')
<< value << '\n';
for (int i = 0; i < 8; ++i) {
std::cout << "bit " << i << ": "
<< (reg.test(i) ? "set" : "unset") << '\n';
}
return 0;
}
输出:
reg: 0xaa
bit 0: unset
bit 1: set
bit 2: unset
bit 3: set
bit 4: unset
bit 5: set
bit 6: unset
bit 7: set
Live Demo on coliru
但是,一个独立的函数
testBit()
#include <cassert>
#include <iostream>
#include <iomanip>
bool testBit(uint8_t reg, int i)
{
assert(i >= 0 && i < 8);
return ((reg >> i) & 1) != 0;
}
int main()
{
volatile uint8_t reg = 0xaa; // 0x10101010
unsigned value = reg;
std::cout << "reg: 0x" << std::hex << std::setw(2) << std::setfill('0')
<< value << '\n';
for (int i = 0; i < 8; ++i) {
std::cout << "bit " << i << ": "
<< (testBit(reg, i) ? "set" : "unset") << '\n';
}
return 0;
}
Live Demo on coliru