如何从 uint16_t 变量中获取 5-7 位?

How to get 5-7 bit from uint16_t variable?

在MDR32(类似于STM32)微控制器中,有一个描述以太网状态的16位STAT寄存器,文档中说7..5位表示接收到的数据包数量,我如何得到这个值并将其保存在 uint16_t 变量中?

根据您阅读符号的方式,要从整数中获取第 5、6 和 7 位,您可以简单地执行以下操作:

auto ethStatus = (stat >> 5) & 7;

如果将位右移 5 位,则这 5..7 位将位于位置 0..2。如果您 bitwise-and 的值为 0b0000000000000111U(位掩码),则位置 3..15 中的所有位都将为 0。这将在最低有效位置留下您想要的 3 位:

unsigned ethernet_status = (STAT >> 5U) & 0b0000000000000111U;

您可以通过将 1 左移 N-1 并减去 1 来生成具有 N 个低位的位掩码:

unsigned bit_first = 5;
unsigned bit_count = 3;
unsigned bit_mask = (1U << bit_count) - 1U;
unsigned ethernet_status = (STAT >> bit_first) & bit_mask;

您可以像这样在变量中存储值:

uint16_t variable = ethernet_status;