Chociaż są już dobre odpowiedzi, pomyślałem, że to podejście może być jeszcze bardziej intuicyjne dla kogoś, kto jest nowy w algebrze Boole'a, niż ocena tabeli prawdy.
Pierwszą rzeczą, którą chcesz zrobić, jest sprawdzenie, w jakich warunkach chcesz wykonać C. Tak jest w przypadku, gdy (a & b)
. Również kiedy !a
. Więc masz(a & b) | !a
.
Jeśli chcesz zminimalizować, możesz kontynuować. Tak jak w „normalnej” arytmetyce, możesz pomnożyć.
(a & b) | !a = (a | !a) & (b | !a)
. a | ! a jest zawsze prawdziwe, więc możesz je po prostu przekreślić, co pozostawi zminimalizowany wynik:b | !a
. W przypadku, gdy kolejność ma znaczenie, ponieważ chcesz sprawdzić b tylko wtedy, gdy! A jest prawdziwe (na przykład, gdy! A jest sprawdzeniem zerowym, a b jest operacją na wskaźniku, jak @LordFarquaad wskazany w swoim komentarzu), możesz chcę zamienić te dwa.
Drugi przypadek (/ * ... * /) będzie zawsze wykonywany, gdy c nie zostanie wykonane, więc możemy po prostu umieścić go w innym przypadku.
Warto również wspomnieć, że prawdopodobnie ma sens umieszczenie akcji c w metodzie.
Co pozostawia nam następujący kod:
if (!A || B)
{
doActionC() // execute method which does action C
}
else
{
/* ... */ // what ever happens here, you might want to put it into a method, too.
}
W ten sposób możesz również zminimalizować terminy z większą liczbą operandów, co szybko staje się brzydkie w przypadku tablic prawdy. Innym dobrym podejściem są mapy Karnaugh. Ale nie będę teraz zagłębiał się w to.