1

Что бы последовательность логических операций со следующей таблицей истинности:Последовательность логических операций со следующей таблицей истинности

mask | target | result 
====================== 
    0 | 0 | 0 
    0 | 1 | 0 
    1 | 0 | 1 
    1 | 1 | 0 

В двух словах, это было бы «переключения, когда бит маски верно, ясно, когда бит маски - false ".


Теперь некоторый контекст:

Я проектирование сигнала поворота с Arduino, и я устанавливаю текущие мигающие огни с битовой маской, используя только два бита:

typedef enum ACTIVE_LIGHTS { 
    NONE  = 0, // 00 
    RIGHT_LIGHT = 1, // 01 
    LEFT_LIGHT = 2, // 10 
    BOTH  = 3 // 11 
}; 

Теперь один Требование таково: когда я запускаю, скажем, toggleLeft() метод, я хочу очистить правый бит и переключить левый.

Я попробовал оба пути, но не работает, как требуется (маска всегда RIGHT_LIGHT или LEFT_LIGHT):

target ^= mask; //this toggles one side but doesn't turn the other off 
target = mask; //this turns other side off, but never turns off same side 

ответ

1

насчет операции AND свет выключить с 0 (X1 и 10 = X0), и XORing свет для переключения с 1 (0X XOR 10 = 1X)?

Edit: окончательный ответ

Похоже, единственный раз, когда 1 выводится, когда маска бит 1 и входной бит 0, так что функция что-то вроде из = маски, а не в, для каждого бита.

+0

Да, я знаю, что могу разложить операцию, но умный один лайнер всегда к чему стремиться :) – heltonbiker

+0

Это правда! Всегда приятно придумать короткий, умный способ сделать что-то. Я буду думать об этом; сложно сделать карту Карно на мобильном телефоне! –

+0

Похоже, что единственный выход 1 - это когда бит маски равен 1, а входной бит равен 0, поэтому функция - это что-то вроде out = mask AND NOT in, для каждого бита. Это помогает? –