【问题标题】:How do you compare only certain bits in data type?您如何仅比较数据类型中的某些位?
【发布时间】:2022-01-09 04:27:27
【问题描述】:

我正在尝试学习一些关于仿真的知识,并且我正在尝试思考如何解码操作码。每个操作码都是一个短数据类型,16 位。我希望能够只比较特定的 4 位集合。例如:有多个以00开头的操作码,比如0x00E0。

我希望能够以位或十六进制形式比较这些值中的每一个。我在想可能是一些类似于位移的东西,以将其他所有东西都关闭,这样我不关心的位就会归零。这可能会导致中心钻头出现问题,并且需要额外的步骤。对于这样的问题,你们使用什么样的解决方案?

【问题讨论】:

    标签: c bit-manipulation


    【解决方案1】:

    您可以轻松创建“nbits”掩码并移动“pos”位数并进行比较

    uint32_t mask = ~((~0) << nbits);
    
    if( (num(mask << pos)) == 0x00e0 ) {
        /* Do something */
    }
    

    【讨论】:

    • 应该是~0ul &lt;&lt; nbits - 否则你会左移到符号位,这是未定义的行为
    • 右移运算符将导致未定义的行为,左移运算符将始终为有符号和无符号给出相同的结果。
    【解决方案2】:

    这很简单bit manipulation。您可以使用

    屏蔽相关位
    int x = opcode & 0x00f0;
    

    并比较结果值

    if (x == 0x00e0) {
        /* do something */
    }
    

    【讨论】:

      【解决方案3】:

      使用位掩码,其中设置了您关心的位。然后使用&amp; 运算符将您不关心的所有内容归零。例如,假设我们要比较 ab 中的最低四位:

      uint16 mask = 0x000f;
      if ((a & mask) == (b & mask)) {
        // lowest 4 bits are equal
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-09
        • 2021-05-24
        • 1970-01-01
        • 2023-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多