quarta-feira, 16 de março de 2011

Dicas de Programação: Redução de expressões com operadores lógicos

Para quem fez informática: alguém se lembra de aritmética lógica?
Sabia que dá para aplicar no código-fonte de uma aplicação?

Por exemplo, se eu tenho a condição:

if (((x == 0) || (y == 0)) && ((x == 0) || (z == 0))) {
...
}

Eu posso reduzi-la pela equivalência:
(A OR B) AND (A OR C) -> A OR (B AND C)

Assim, eu posso simplificar o código da seguinte maneira:

if ((x == 0) || ((y == 0) && (z == 0))) {
...
}

A mesma coisa, eu poderia fazer com outras expressões:
(A AND B) OR (A AND C) -> A AND (B OR C)
(A AND B) AND (A AND C) -> A AND B AND C
(A OR B) OR (A OR C) -> A OR B OR C

O legal, é que vale para aquelas expressões mais "complicadas" (ou mais "cabeças", como alguns falam :P ) :
NOT A OR NOT B -> NOT (A AND B)
NOT A AND NOT B -> NOT (A OR B)
(NOT A AND B) OR (NOT B AND A) -> A XOR B
(NOT A OR B) AND (NOT B OR A) -> NOT (A XOR B)

Vamos pegar a última expressão acima:

if (((!(a > b)) || (c < d)) && ((!(c < d)) || (a > b))) {
...
}

Aplicando:
(NOT A OR B) AND (NOT B OR A) -> NOT (A XOR B)

Temos:

if (!((a > b) ^ (c < d))) {
...
}

Será que isso ajuda alguém?

Até!

Nenhum comentário: