Мой профессор поставил эту задачу на следующую неделю. Вы должны создать переменные и в одном выражении создать алгоритм, который дает 1 (true), когда вычисляются заданные x, y, z и в каждом другом состоянии x, y, z результат равен 0. Использование только побитовых операторов (| , &).
x = 1
y = 0
z = 0
result 1
x = 0
y = 1
z = 0
result 1
x = 0
y = 1
z = 1
result 1
Все остальное должно быть 0 (false)! Мы не должны использовать какие-либо функции, циклы, переключатели или что-либо еще. Всего 1 строка выражения.
Он сказал, что мы должны использовать 9 переменных и 8 операций, поэтому я предполагаю, что алгоритм должен выглядеть следующим образом:
(xOyOz) O (xOyOz) O (xOyOz)
Это дает 9 переменных 3*x
, 3*y
, 3*z
и 8 операций 8*O
(одно из следующего должно быть в этом месте |, &)
Вы можете использовать оператор ^ (XOR).
((x^y)&(x^z))|(y&(x^y)&(y^z))
Вот именно 9 переменных и 8 операций
Основная идея заключается в том, что для каждого 1 результата:
&
вместе все битовые переменные как 1 с (not
любые 0, чтобы сделать их 1 с ~
).|
эти группы вместе.Это даст вам не только 1 результат для всех заданных 1 результатов, но и 0 результатов для любой другой комбинации.
Поэтому (неоптимизированное) побитовое выражение в этом случае:
(x & ~y & ~z) | (~x & y & ~z) | (~x & y & z)
Это знаю как Карта Карно и не только широко используется при манипулировании битами, но также и как логический фильтр общего назначения для данных любого рода.