Что бы последовательность логических операций со следующей таблицей истинности:Последовательность логических операций со следующей таблицей истинности
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
Да, я знаю, что могу разложить операцию, но умный один лайнер всегда к чему стремиться :) – heltonbiker
Это правда! Всегда приятно придумать короткий, умный способ сделать что-то. Я буду думать об этом; сложно сделать карту Карно на мобильном телефоне! –
Похоже, что единственный выход 1 - это когда бит маски равен 1, а входной бит равен 0, поэтому функция - это что-то вроде out = mask AND NOT in, для каждого бита. Это помогает? –