소스코드리뷰(II) 논리연산을 간결히 하라

[목차(도우미)]

같은 결과를 얻는 것으로 만족하지 말고 최적화된 소스코드를 작성할 수 있도록 연구해야 한다.

논리적으로 명쾌한 소스코드는 에러가 적고 유지보수가 간결하다. 그리고 실행 속도를 높이는 결과로 이어진다.

흔히 사용하는 판단문의 예
 if (p = True) then
   if (q = True) then
      Z := I //expression
   else
      Z:= II; //expression
 else begin
   if (q = True) then
      Z := III //expression
   else
      Z:= IV; //expression
end;

여기서 ( p = True) 는 p 와 진리값이 같으므로 if p then 만으로 충분하다.

그러나 간단한 논리연산식을 사용하면 실행 속도를 높일수 있다. 그리고 복잡한 판단을 피하고 기계적 연산을 수행함으로 소스가 간단해 진다.

위의 판단문은 행렬 형식으로 배열해 보면 다음과 같아진다.

Z
q=T q=F
p=T I II
p=F III IV

위 경우 논리식은 Z := I Or II Or III Or IV
I, II, III, IV가 동시에 성립할 수 없으므로 합사건이고 각각의 p, q는 곱사건으로 해석할수 있다.

*이제부터는 논리연산을 대수연산으로 고쳐서 기술한다. Or = +,   And = * 또는 생략, Not = ' (작은 따옴표, 프라임 기호)

(참조: 가법표준형)

그러면  p Or F = p 임에 착안하면 True인 경우만 논리합을 구하면 결과식이 구해진다.
예를 들어 (I, II, III, IV) = (T, T, T, F)라면,
Z
q=T q=F
p=T T T
p=F T F

Z:
= I Or II Or III

= I + II + III

=p*q + p*q' + p'*q


(양: 너무 어려워서 그냥 잘래요.)


카르노법을 이용하는 방법

이식을 간단히 하는 방법이 있는데, 연산 법칙을 써서 간단히 하기 보다는 카르노도(Karnaugh 도)를 만들었으니 그방법을 사용하는 것이 더욱 간편하다. 카르노법을 이용하는 근본적인 원리는 p + p' = T, p*T = p를 이용하는 것이다.
Example I
행렬로 표현한 식 =
T T
T F
=
T T
F F
+
T F
T F
= p + q
((T,T),(F,F))는 굳이 전개하자면 pq + pq' = p(q+q') = pT = p이고 ((T,F),(T,F))도 직관적으로 q임을 알수 있다.

좀더 확장하여 3가지 변수 p, q, r의 경우라면, 총 8가지 경우의 수가 가능하고 4*2 행렬을 이용하면 된다.
예를 들면 쉽다.

Example II
(p, q)
r=T
r=F

TT
T
T

TF
F
T

FF
F
F
<----- 이 FT 가 아닌 FF 순서에 주의
FT
T
F
<----- 이 FT 순서에 주의
라 하면, 인접한 요소가 (p + p' = T)를 이용하도록 배치하였음에 주의 하여볼 때

Z:= TT
FT
FF
TF
=
TF
FF
FF
TF
+ FT
FT
FF
FF
=qr + pr' 임을 쉽게 알수 있다.

첫번째 요소는 p에 무관하고 (q=T) And (r= T)이므로 qr이 된다.
두번째 요소는 q에 무관하고 (p=T) And (r = F)이므로 pr'이 된다.

결과적으로 8가지 패턴을 가지는 3중 판단문을 한가지 논리식으 로 이어주면 된다!
여기서의 설명을 잘 모르겠으면 불 대수, 카르노도, 카르노맵등을 참고하기 바란다.
by 금메달.아빠 on 2010. 5. 21. 23:54