【问题标题】:Check that all bits are set except the Least Significant Bit by using masks使用掩码检查是否设置了除最低有效位之外的所有位
【发布时间】:2019-12-03 12:07:02
【问题描述】:

我只是在 C(初学者)中试验位域。 假设我有一个整数:

uint8 myBitfield

如何检查除最低有效位之外的所有位都已设置。

我认为这会起作用:

if ((myBitfield & 0xFE) == 1)   // 0xFE = 0b11111110
{
/*yes all bits except the Least Significant is set*/
}

有什么建议吗?

【问题讨论】:

  • 提示:尝试一个应该通过这个的位域的例子,看看当你与 0xFE 时你实际得到了什么。你不会得到 1...
  • if 指令应该是if ((myBitfield & 0xFE) == 0xFE)。你没那么远。请注意,测试的最后一位可能是 0 或 1。这就是你想要的吗?
  • if (myBitField == 0xFE) {} 确保设置了除 LSB 之外的所有位。有点怀疑这就是你的意思。

标签: c bit-fields


【解决方案1】:

您编写的代码不会检查您所期望的

if ((myBitfield & 0xFE) == 1)   // 0xFE = 0b11111110
{
/*yes all bits except the Least Significant is set*/
}

不仅如此,if 块内的代码永远不会被执行,因为您通过& 0xFE 操作清除了myBitfield 的最低有效位 (LSB)。

您正在寻找的可以通过以下方式实现:

if (myBitfield == (uint8_t)~1)   // (uint8_t)~1 = 0b11111110
{
/*yes all bits except the Least Significant is set*/
}

请注意,这不是实施此类检查的唯一方法。例如,也可以写成

if (myBitfield == 0xFE)

if ((uint8_t)(myBitfield + 2) == 0)  // 0b1111110 + 0b00000010 = 0b1_00000000

等等……

编辑

如果您的意思是要检查位 1 到 7 是否已设置,而位 0 可以是任何值,那么您可以“强制”该位(位 0)为 0,并将结果与​​所有位的掩码进行比较从第 1 位设置到第 7 位(即 0xFE):

if ( (myBitfield & 0xFE) == 0xFE)

当然,您也可以在不应用按位运算的情况下检查所有可能的选项,但在我看来,按位检查看起来更好,而且它还引入了更好的性能,因为它只有一个分支,而下面的示例包含 2 个分支:

if (myBitfield == 0xFE || myBitfield == 0xFF)

【讨论】:

  • 这并不测试除了最低有效位之外的所有位是否都已设置。它测试是否设置了除最低有效位之外的所有位,并且最低有效位为零。
  • @EricPostpischil 如果我错了,请纠正我,但“我如何检查除最低有效位之外的所有位都已设置。”意味着除了最不重要的位(据我所知,没有设置)之外,所有位都应该被设置。
  • 该短语不包括最低有效位,并声明对其没有要求。人类是不精确且容易出错的,因此说话者可能有其他意思。但是,如果他们想测试是否设置了高七位而最低位没有设置,他们要求测试这些位是否为 11111110,而明显的测试是myBitfield = 0xFE。他们尝试myBitfield & 0xFE 的事实进一步表明他们试图分别考虑高七位而忽略低位。
【解决方案2】:

我们来吧。

uint8 myBitfield2 = myBitfield;

myBitfield 右移1 位。

myBitfield2 = myBitfield2 >> 1;

这将导致 myBitfield2 右移并逐出最低有效位。

0x80 [0b1000000]myBitfield2

这将在myBitfield2 的最重要位置插入一个 1。

通过执行myBitfield = 0xFF - myBitfield 查找myBitfield 的补码。

检查补码是否为0,则原始位域的所有位都为 1,除了 lsb。 lsb 可以是任何东西。


int bitField = 0xFF;
int bitField2 = bitField >> 1;
bitField2 = bitField2 | 0x80;
if(0xFF-bitField2==0){
    //All bits except the lsb is 1
}

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 2021-06-05
    • 2010-10-19
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多