如何正确地从uint16_t变量中提取一个特定位

Par*_*dox 0 c++ embedded wrapper bit

简而言之,我目前正在用C++编写C++包装器,用于提取嵌入式系统寄存器的值.为了监视发生的情况,我需要为某些寄存器读取一个位的值,并为每个寄存器创建一个getter.

基本上,我希望我的方法从存储到uint16_t变量中的一个位返回一个bool.在一个'天真'和没有咖啡因的方法我做了类似的事情:

bool getBusyDevice(int fd) // fd stands for file descriptor, for each instance of the class
{
    uint16_t statusRegVal = 0;
    get_commandReg(fd, &statusRegVal); // C-library function to get the value of status register
    uint16_t shift = 0; // depends on the bit to access - for reusability
    bool Busy = (bool) (statusRegVal >> shift);
    return busy;
}
Run Code Online (Sandbox Code Playgroud)

我对结果不太满意,我想知道是否有"正确"的方法来做到这一点......

非常感谢您的建议!

Som*_*ude 5

获得一位的正常方法是使用按位运算符&.比如说statusRegVal & bitValue.如果设置了该位,则结果将等于bitValue,这意味着要获得布尔结果,您可以进行简单的比较:statusRegVal & bitValue == bitValue.

因此,如果您想检查是否设置了零位(具有该值0x0001),那么您可以这样做

return statusRegVal & 0x0001 == 0x0001;
Run Code Online (Sandbox Code Playgroud)

  • 要清楚,请说"bitmask"标识要检查的位.然后比较变成`((statusRegVal&bitmask)== bitmask)`. (2认同)