Алгоритм в C ++ с побитовыми операторами

Мой профессор поставил эту задачу на следующую неделю. Вы должны создать переменные и в одном выражении создать алгоритм, который дает 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 (одно из следующего должно быть в этом месте |, &)

-1

Решение

Вы можете использовать оператор ^ (XOR).

((x^y)&(x^z))|(y&(x^y)&(y^z))

Вот именно 9 переменных и 8 операций

2

Другие решения

Основная идея заключается в том, что для каждого 1 результата:

  1. Вы & вместе все битовые переменные как 1 с (not любые 0, чтобы сделать их 1 с ~).
  2. затем | эти группы вместе.
  3. Необязательно рефакторинг это общее решение в более простой форме.

Это даст вам не только 1 результат для всех заданных 1 результатов, но и 0 результатов для любой другой комбинации.

Поэтому (неоптимизированное) побитовое выражение в этом случае:

(x & ~y & ~z) | (~x & y & ~z) | (~x & y & z)

Это знаю как Карта Карно и не только широко используется при манипулировании битами, но также и как логический фильтр общего назначения для данных любого рода.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector