首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地从uint16_t变量中提取一个特定位

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

Stack Overflow用户
提问于 2016-02-22 09:50:39
回答 5查看 4K关注 0票数 1

长话短说,我目前正在C++中为C库编写一个包装器,它提取嵌入式系统上寄存器的值。要监视发生了什么,我需要读取一些寄存器的位值,并为每个寄存器创建一个getter。

基本上,我希望我的方法从存储在uint16_t变量中的位返回一个bool。在一种“天真”和不受约束的方法下,我做了这样的事情:

代码语言:javascript
复制
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;
}

我对这个结果不太满意,我想知道是否有一种“正确”的方法来做到这一点。

非常感谢你的建议!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-02-22 09:54:57

只获取一个位的正常方法是使用按位和运算符&。比如statusRegVal & bitValue。如果设置了位,那么结果将等于bitValue,这意味着要获得一个布尔结果,您可以做一个简单的比较:statusRegVal & bitValue == bitValue

因此,如果要检查位零(其值为0x0001)是否已设置,则只需执行以下操作

代码语言:javascript
复制
return statusRegVal & 0x0001 == 0x0001;
票数 7
EN

Stack Overflow用户

发布于 2016-02-22 16:20:53

为了更好地理解您想要的内容,请查看下面的链接

掩蔽:(computing)

位操作:manipulation

结论:如果你想读取特定数量的比特变量(寄存器),你应该用这个变量制作一个带有位位置的掩膜。假设您有2字节变量(u16Reg),并且希望读取位数5,7,所以,value = ((u16Reg & 0x00A0) >> 5)。在这种情况下,您希望读取一位并返回其状态TRUEFALSE

代码语言:javascript
复制
value = ((u16Reg & (0x0001 << n)) >> n)

其中n是你想读的位数。

让我们理解它。假设u16Reg = 0x529D = 0b0101001010011101;bit =1和bit15 = 0;您希望得到位号9。因此,首先要确保除您的位(9)以外所有位都是零。

代码语言:javascript
复制
(0b0101001010011101 & (0x0001 << 9))      = 
(0b0101001010011101 & 0x0200)             = 
(0b0101001010011101 & 0b0000001000000000) =
(0b0000001000000000)                      = 0x0200

这意味着如果您的意思是nonZero为真,则为TRUE。但是,如果TRUE意味着0x01,则应该将此位移动到以下位置:(0x0200 >> 9) = 0x0001是真的,如果您能够理解这一点,您可以简化如下:

代码语言:javascript
复制
value = ((u16Reg >> n) & 0x0001)
票数 2
EN

Stack Overflow用户

发布于 2016-02-22 09:57:15

为什么不使用模板:

代码语言:javascript
复制
template<int SHIFT>
bool boolRegVal(uint16_t val) {
   return val & (1 << SHIFT);
}

然后使用:

代码语言:javascript
复制
boolRegVal<4>(statusRegVal);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35550441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档