Есть ли алгоритмический подход к этой проблеме? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть набор кодов операций для выполнения определенной функции, но здесь есть сложная часть: например, в приведенном ниже коде, channelABC является входом, что означает: если на моей стороне продукта есть канал A или канал b, иликанал c выбран, он должен совпадать, ИЛИ, если на моей стороне продукта. если выбран канал b и c, он должен совпадать, в основном, если один или несколько каналов совпадают (со стороны входа или со стороны продукта), - светодиод должен светиться.

Я пытался отобразить его, но яне уверен в правильном способе сделать это

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, и у меня есть зона AB в моем продукте, и поскольку присутствуют две зоны A и b, на нем должен гореть светодиод

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Вы можете использовать концепцию масок. Определите маску для зон, которые поддерживает ваш продукт, т.е. создайте переменную и установите бит для каждой зоны, которую поддерживает ваш продукт. Например, если ваш продукт поддерживает зону A и зону 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, то есть Zone поддерживается.

Если ваш railzone_input равен ZoneB (то есть 2), то2 & 5 = 0, что == 0, то есть Zone не поддерживается.

0 голосов
/ 28 октября 2019

Не совсем понятно, что вам нужно делать, но похоже, что вы хотите выполнить определенную операцию, если установлены некоторые биты переменной, это можно сделать с помощью оператора & (и).

Например, если вы хотите что-то сделать для любого railzone, для которого включена зона A (бит 0), тогда вы можете сделать

railzone = ZoneAB;

if ((railzone & ZoneA) == ZoneA) {
  // turn on led for ZoneA?
}
...