长话短说,我目前正在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;
}我对这个结果不太满意,我想知道是否有一种“正确”的方法来做到这一点。
非常感谢你的建议!
发布于 2016-02-22 09:54:57
只获取一个位的正常方法是使用按位和运算符&。比如statusRegVal & bitValue。如果设置了位,那么结果将等于bitValue,这意味着要获得一个布尔结果,您可以做一个简单的比较:statusRegVal & bitValue == bitValue。
因此,如果要检查位零(其值为0x0001)是否已设置,则只需执行以下操作
return statusRegVal & 0x0001 == 0x0001;发布于 2016-02-22 16:20:53
为了更好地理解您想要的内容,请查看下面的链接
掩蔽:(computing)和
位操作:manipulation
结论:如果你想读取特定数量的比特变量(寄存器),你应该用这个变量制作一个带有位位置的掩膜。假设您有2字节变量(u16Reg),并且希望读取位数5,7,所以,value = ((u16Reg & 0x00A0) >> 5)。在这种情况下,您希望读取一位并返回其状态TRUE或FALSE。
value = ((u16Reg & (0x0001 << n)) >> n)其中n是你想读的位数。
让我们理解它。假设u16Reg = 0x529D = 0b0101001010011101;bit =1和bit15 = 0;您希望得到位号9。因此,首先要确保除您的位(9)以外所有位都是零。
(0b0101001010011101 & (0x0001 << 9)) =
(0b0101001010011101 & 0x0200) =
(0b0101001010011101 & 0b0000001000000000) =
(0b0000001000000000) = 0x0200这意味着如果您的意思是nonZero为真,则为TRUE。但是,如果TRUE意味着0x01,则应该将此位移动到以下位置:(0x0200 >> 9) = 0x0001是真的,如果您能够理解这一点,您可以简化如下:
value = ((u16Reg >> n) & 0x0001)发布于 2016-02-22 09:57:15
为什么不使用模板:
template<int SHIFT>
bool boolRegVal(uint16_t val) {
return val & (1 << SHIFT);
}然后使用:
boolRegVal<4>(statusRegVal);https://stackoverflow.com/questions/35550441
复制相似问题