Как реализовать логические операторы, используя побитовые операторы - PullRequest
1 голос
/ 23 сентября 2019

Как можно реализовать логические операторы || и &&, используя только побитовые операторы &, ^, |, ~, >>, << логический оператор ! а +?Я посмотрел вокруг на переполнение стека и Google для чьего-то предыдущего ответа или некоторых реализаций сборки, но пока ничего не нашел.Я полагаю, что если ни у кого нет решения, я мог бы просто обратиться к HDL и посмотреть, что он синтезирует.

1 Ответ

6 голосов
/ 23 сентября 2019

Они не могут быть такими, хотя было бы заманчиво предположить, что a && b можно записать как !!a & !!b и a || b как !!a | !!b.

Это потому, что || и && имеют свойство, при котором вычисление второго аргумента не происходит, если результат выражения известен из результата первого аргумента.Например, для true || A, A не оценивается, а для false && B, B не оценивается.Поэтому, если вы попытались реплицировать либо ||, либо && с помощью побитовых операторов, то вы вполне могли бы ввести побочные эффекты в вашу программу.

Также || и && являются точками секвенирования , тогда как побитовые операторы - нет.Так, например, a++ && a++ определено, но a++ & a++ не определено.

...