아침 CS - (6) 논리 연산

논리 연산

부울 대수(Boolean Algebra)라고도 불리는 논리 연산의 기본 개념은 19세기 중반 영국의 수학자 조지 부울이 창안했다고 한다.

조지 불

두 개의 상태(True - 1, False - 0)를 갖고 연산을 수행하기때문에 컴퓨터 과학에서는 빼놓을 수 없는 주제이며 프로그래밍에선 IF문, FOR - EACH, WHILE 등 정말 이거 없이 프로그래밍을 어떻게 하나 싶을 정도로 폭넓게 사용되고 있다.

논리 게이트?

논리 게이트는 하나 또는 그 이상의 입력신호로부터 하나의 출력값을 발생시키도록 구성된 전자 회로다. 전자 회로는 두 개의 구분되는 전기적 신호에 따라 작동하도록 설계되고, 논리 - 1, 논리 - 0 과 같은 이진 변수로 표현할 수 있는 구분된 응답을 되돌려주게 된다.

허용된 범위 내의 전기적 신호가 회로에 들어오면, 그 범위를 판단하여 정해진 전기 신호를 출력하는 것이다. Arduino를 해보면 잘 알게 된다.

진리표

논리연산을 공부할 때 꼭 그려봐야 하는 것이 바로 진리표다.

논리 연산의 가능한 결과값을 표에 모두 나타낸 것을 진리표라고 한다. 논리 연산의 결과가 혼동되거나 뭔가 이해가 안된다 싶으면 그려보는 것이 좋다.

A AND B 논리연산

A B 결과값
0 0 0
0 1 0
1 0 0
1 1 1

논리 연산의 종류

크게 7가지의 종류가 있다.

부정(NOT)

부정하는 것이다. 여러분 이거 다~ 거짓말인 거 아시죠?

입력값 결과값
0 1
1 0

C의 영향을 받은 언어에서는 !를 부정 연산자로 쓴다. ~ 라고도 표현한다.

“보수 연산자” 혹은 “부울 보수” 라고도 하는 모양이다. 보수 연산자라는 표현은 자주 들어봤지만…

논리곱(AND)

“앤드 조건문” 안 들어본 사람은 없을 것이다. 주로 & 기호를 사용한다.

두 명제가 모두 참이여야 참이 되는 연산이다.

입력값 결과값
0 , 0 0
0 , 1 0
1 , 0 0
1 , 1 1

논리합(OR)

“OR 조건문” 안 들어본 사람은 없을 것이다. 주로 | 기호를 사용한다.

두 명제 중 하나만 참이라도 참이 되는 연산이다.

입력값 결과값
0 , 0 0
0 , 1 1
1 , 0 1
1 , 1 1

부정 논리곱(NAND)

Not AND 라고 한다. 논리곱의 결과를 한 번 부정(NOT)한 것이다.

여기서부턴 안 들어본 사람도 있을 것이다.

두 명제가 모두 참이면 거짓, 이외에는 모두 참이다. 논리곱의 경우 두 명제가 모두 참일때만 참을 돌려주므로 이를 부정하니 당연한 결과이다. 낸드 메모리는 진짜 NAND 회로로 만드는 것이라고 한다.

입력값 결과값
0 , 0 1
0 , 1 1
1 , 0 1
1 , 1 0

부정 논리합(NOR)

Not OR 이다. 논리합의 결과를 부정한 것이다. 두 명제가 모두 거짓이어야 참, 이외엔 모두 거짓.

입력값 결과값
0 , 0 1
0 , 1 0
1 , 0 0
1 , 1 0

배타적 논리합(XOR), 동치(EQV)

XOR

두 명제 중 하나만 참이거나, 두 명제의 참거짓이 다를때 참이다. 암호화 기법으로도 많이 사용된다고 한다.

입력값 결과값
0 , 0 0
0 , 1 1
1 , 0 1
1 , 1 0

EQV

두 명제가 같은 값을 가지면 참, 아니면 거짓. 배타적 논리곱이라고도 한다.

입력값 결과값
0 , 0 1
0 , 1 0
1 , 0 0
1 , 1 1