gpt4 book ai didi

c - 从寄存器中读取 2 位

转载 作者:太空宇宙 更新时间:2023-11-04 02:12:00 24 4
gpt4 key购买 nike

我正在查看 NIC 的数据表规范,上面写着:

寄存器的第 2:3 位包含 NIC 速度,第 4 位包含链路状态等。如何使用按位隔离这些位?

例如,我看到隔离链接状态的代码如下:

(link_reg & (1 << 4))>>4

但我不太明白为什么右移。我必须说,我仍然对按位运算不太满意,尽管我了解如何转换为二进制以及每个运算的作用,但它并不实用。

最佳答案

这取决于你想用那个位做什么。链接状态,称之为 L 在某处的变量/寄存器中

    43210
xxxxLxxxx

要隔离你想要的那个位,并用 1,按位操作:

  xxLxxxx
& 0010000
=========
00L0000

1<<4 = 1 带 4 个零或 0b10000,您想要的数字。

status&(1<<4) 

这将给出零或 0b10000 的结果。您可以进行 bool 比较以确定它是假(零)还是真(非零)

if(status&(1<<4))
{
//bit was on/one
}
else
{
//bit was off/zero
}

如果你想让结果为 1 或 0,你需要将结果移动到个位

  (0b00L0000 >> 4) = 0b0000L

如果 and 的结果为零,则移位仍为零,如果结果为 0b10000,则 4 的右移给出 0b00001

所以

(status&(1<<4))>>4 gives either a 1 or 0;

(xxxxLxxxx & (00001<<4))>>4 =
(xxxxLxxxx & (10000))>>4 =
(0000L0000) >> 4 =
0000L

另一种使用较少操作来做到这一点的方法是

(status>>4)&1;
xxxxLxxxx >> 4 = xxxxxxL
xxxxxxL & 00001 = 00000L

关于c - 从寄存器中读取 2 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12926670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com