【问题标题】:Equality operator versus bitwise AND operator usage相等运算符与按位 AND 运算符的使用
【发布时间】:2017-03-02 01:48:02
【问题描述】:

在C语言中,我经常看到if这样的语句:

#define STATUS 0x000A
UINT16 InterruptStatus;
if (InterruptStatus & STATUS)
{
 <do something here....>
}

如果我有此声明,在处理时间或任何其他原因上是否会有所不同,这不是首选/替代方式?

#define STATUS 0x000A
UINT16 InterruptStatus;
if (InterruptStatus == STATUS)
{
 <do something here....>
}

【问题讨论】:

  • InterruptStatus 应该是位域吗?还是应该只包含一个值?

标签: c equality bitwise-and


【解决方案1】:

嗯,它们是一样的。

对于bitwise AND,两个不同的操作数值可以产生true,而对于equality,两者必须相同。

将十进制值 53 视为操作数。

  • 按位与将产生一个 TRUE 值用于条件检查 (5 &amp; 3 == 1)。
  • 相等将产生 FALSE 值 (5 ==3 ==&gt; false)

所以它们不是替代品,真的。

按位运算广泛用于检查 flag 变量的特定位是“设置”还是“未设置”。

【讨论】:

  • 离题但按位异或可能相对经常遇到(反向)比较。
【解决方案2】:

这可用于检查某个数字是否设置了某些位,因此它不同于相等。

假设你有一些二进制数表示为0b00010001

并且您想检查是否设置了第 4 位,所以您需要这样做

if(0b00010001 & 0b00010000)
 // do something.

因此,上述两个数字不一定相等 - 但是,使用上述检查您可以验证 0b00010001 数字上是否设置了第 4 位。

【讨论】:

  • 当从 FPGA 寄存器读取中断时,它用于有趣的上下文中。据我了解,作者的意图可能是在位位置 1 或 3 ( 0x000A ) 处触发任何中断时触发,尽管违反直觉。
【解决方案3】:

&amp;bitwise AND 运算符。用于检查某个位置的位是否打开。

== 是一个 equality 运算符,仅当两个操作数的值完全匹配时才返回 true。

有关 C 中运算符的更多信息:https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

【讨论】:

    【解决方案4】:

    如果任何一个位匹配0x000A,则前一位将在逻辑上为真。它不必完全等于 0x000A;如果

    if ((InterruptStatus == 0x0008) || (InterruptStatus == 0x0002))
    

    底部代码确保它绝对等于 0x000A。

    【讨论】:

    • "it could be true if..." 不仅如此,它还忽略了其他位的状态。 IOW,即使例如InterruptStatus==0x28.
    【解决方案5】:

    两者都不一样。

    == 是关系运算符

    & 是一个有点聪明的运算符

    来自tutorials point

    == :检查两个操作数的值是否为equal。如果是,则条件变为true

    & :如果两个操作数中都存在二进制 AND 运算符,则将其复制到结果中。

    例如:

    A= 12 , B =13

    A == B:由于两者不同,所以输出为 false

    A & B:输出为真

    A = 0000 1100

    B = 0000 1101

    A&B = 0000 1100 -> 是 12,它是一个有效的整数。所以条件为真

    【讨论】:

    • 谁在这里询问逻辑与?
    • @SouravGhosh 这是一个错误。我正要编辑它
    • 删除了反对票。一个建议:尝试改进内容和格式,使其更易于阅读和理解。
    • 话虽如此,我会尽量听从你的建议
    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 2013-07-25
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2013-03-10
    • 2011-05-30
    • 2012-09-06
    相关资源
    最近更新 更多