0

我有一组操作码来执行特定功能,但棘手的部分在这里:例如在下面发布的代码中,channelABC 是输入,这意味着:如果在我的产品端有通道 A,或通道 b,或通道 c 是选择,它应该匹配,或者,如果在我的产品方面。如果选择了通道 b 和 c,它应该匹配,基本上如果一个或多个通道匹配(输入侧或产品侧),- Led 必须发光。

我试图映射它,但我不确定正确的方法

typedef enum{
    ZoneA  = 0x01,
    ZoneB  = 0x02,
    ZoneC  = 0x04,
    ZoneD  = 0x08,
    zoneE  = 0x10,
    ZoneF  = 0x20,
    ZoneG  = 0x40,
    ZoneH  = 0x80,
    ZoneABCD = 0x0f,
    ZoneAB = 0x03,
    ZoneAC = 0x05,
    ZoneAD = 0x09,
    ZoneBC = 0x06,
    ZoneBD = 0x0A,
    ZoneCD = 0x0C,
    ZoneABC = 0x07 ,
    ZoneABD = 0x0B,
    ZoneBCD = 0x0E,
    NOZONE  = 0x00

}zone;


railzone =buffers[0];  //rail zone read the value , which is  the first element in the buffer when the packet info is transformed to buffer
            //railzone will have the input here
            if(railzone ==ZoneABCD || railzone == ZoneA  || railzone == ZoneB || railzone == ZoneC || railzone == ZoneD  || railzone == ZoneAB
                    || railzone == ZoneAC || railzone == ZoneAD || railzone == ZoneBC || railzone == ZoneBD || railzone == ZoneCD || railzone == ZoneABC ||
                    railzone == ZoneABD || railzone == ZoneBCD   )      
            {


            }

我作为 ZONEABC 提供输入,并且我的产品中有 zoneAB,并且由于 zoneA 和 b 中的两个存在,它应该会点亮 LED

4

2 回答 2

1

您可以使用面具的概念。定义您的产品支持的区域的掩码,即创建一个变量并为您的产品支持的每个区域设置位。例如,如果您的产品支持 Zone A 和 Zone C

(考虑到你的枚举)

#define PRODUCT_MASK (ZoneA | ZoneC)

然后将输入清理为

if((railzone_input & PRODUCT_MASK)  != 0)
{
    // Zone is supported 
}
else
{
   // Zone is not supported
}

如果您的 railzone_input 是 ZoneBC(即 6),并且正如我在上面的示例中所考虑的,您的 PRODUCT_MASK 将为 5。因此 6 & 5 = 4 即 != 0 即支持区域。

如果您的 railzone_input 是 ZoneB(即 2),则 2 & 5 = 0 即 == 0 即不支持区域。

于 2019-10-28T16:08:54.523 回答
0

目前尚不清楚您需要做什么,但如果设置了变量的某些位,您似乎想要执行特定操作,这可以使用&(and) 运算符来完成。

例如,如果您想在railzone启用了区域 A(位 0)的任何设备上执行某些操作,那么您可以执行

railzone = ZoneAB;

if ((railzone & ZoneA) == ZoneA) {
  // turn on led for ZoneA?
}
于 2019-10-28T15:48:42.227 回答