我有一组操作码来执行一个特定的功能,但棘手的部分在这里:例如在下面的发布代码中,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   )
            {


            }

我输入的是zoneac,我的产品中有zonea b,因为zonea和b中有两个存在,所以它应该会发光

最佳答案

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

#define PRODUCT_MASK (ZoneA | ZoneC)

然后将输入清理为
if((railzone_input & PRODUCT_MASK)  != 0)
{
    // Zone is supported
}
else
{
   // Zone is not supported
}

如果您的railzone_输入是zonebc(即6),正如我在上面的示例中所考虑的,您的产品_掩码将是5。所以6&5=4就是!=0,即支持区域。
如果您的railzone_输入是zoneb(即2),则不支持2&5=0(即等于0,即zone)。

09-25 21:27