본문 바로가기

[Kotlin&Spring] 5기 내일배움캠프

[Kotlin&Spring] 5기 논리 연산자와 비트 이동 연산자(shift)

Java 강의를 본격적으로 듣기 시작하면서  다양한 연산자에 대해 배웠다

산술연산자, 논리연산자, 비트논리연산자등 다양했다

의문을 갖게 된 것은 먼저 논리연산자는 내부적으로 어떻게 작용할까? 라는 의문이었다

 

논리연산자는 크게 AND, OR, XOR, NOT 종류가 있다

위 이미지는 게이트, 왼쪽으로 A, B의 값이 들어오면 Y  라는 결과값이 나오는 구조를 보여준다

AND 는 A, B 값 또는 연산이 모두 참일 때만 참인 결과를 나타내는 연산자이다

OR 은 A, B 값 또는 연산 중 하나만 참이거나, 둘 다 참이면 참인 결과를 나타낸다

XOR 은 A, B 값 중 하나만 참이어야 참인 결과를 나타내는 연산자이다

NOT 은 A 값의 반대값을 나타내는 연산자이다 //A가 참일경우 결과값은 거짓

 

위 이미지는 비트논리연산자로, 컴퓨터 내에서 이진수의 숫자로 연산하는 과정을 보여준다

나는 이런 연산이 언제 쓰이는가? 에 대해서 의문이 들었다

컴퓨터는 우리가 사용하는 고급언어가 아닌 이진수의 숫자나 어셈블리어 등만 이해할 수 있다

그래서 만약 우리가 명령어로써 컴퓨터에게 연산을 하도록 하면 컴퓨터는 +-/* 와같은 연산자를 논리 연산자로 수행한다

 

예를 들어 1101(2) + 1111(2) 의 연산은 자릿수마다 일어난다

덧셈이 이루어지면 한 자리의 값은 1 또는 0 만 존재할 수 있다

그렇다면 A값 1, B값 1의 연산이 이루어지면 결과값은 0이다

A값 1, B값 1이면 결과값은 0이다 

A값 1, B값 0이면 결과값은 1 이다

A값 0, B값 1이면 결과값은 1이다

A값 0, B값 0이면 결과값은 0이다

덧셈 연산은 위 표에서 볼 수 있듯 XOR 연산을 수행한 결과와 같다

 

뺄셈 연산은 어떨까?

A값 1, B값 1이면 결과값은 0이다

A값 0, B값 1이면 결과값은 1이다

A값 1, B값 0이면 결과값은 1이다

A값 0, B값 0이면 결과값은 0이다

덧셈과 같이 XOR 연산을 수행하는 것을 확인할 수 있다

 

곱셈 연산도 시도해보자

이진수의 곱셈은 흔히 십진수에서 이루어지는 곱셈 방식과 같이 먼저 곱셈 과정이 일어나고 그 후 위와 같은 덧셈연산을 통해 값을 나타낸다

먼저 일어나는 곱셈 연산 결과는 아래와 같다

A값 1, B값 1이면 결과값은 1

A값 1, B값 0이면 결과값은 0

A값 0, B값 1이면 결과값은 0

A값 0, B값 0이면 결과값은 0

곱셈연산 값은 AND 연산 결과값와 같다는 것을 확인할 수 있다  

그 후에 덧셈연산인 XOR 연산이 일어난다

 

이진수 나눗셈의 과정은 비트 시프트 연산, 비교 연산, 뺄셈 연산이 필요하다

복잡한 과정이기 때문에 하나의 논리연산으로는 나타낼 수 없다

 

그래서 그 중 하나인 비트 이동 연산을 알아보고자 한다

예컨데 101(2), 십진수로 5인 수에 대해

5 << 2 의 연산을 하면, 10100(2)의 결과가 된다 이 값은 20이다

이 값은 위 사진에 따른 5 * 2^2 의 결과값과 같다

반대로 1001(2), 십진수로 9인 수에 대해

9 >> 3 의 연산을 하면, 1(2)값, 1이 된다

이 값은 9 / 2^3 의 결과값과 같다

몫만 값으로 가지는 것에 대해 의문을 가졌는데, 비트 이동 연산은 정수값으로 이루어지고 결과값도 항상 정수이기 때문에 가능한 연산이었다  

 

비전공자, 문과인 나에게 이진수 연산은 조금 어려웠다

그러나 천천히 예시를 통해 생각해보니 어느정도 이해할 수 있었다 

그리고 알아보는 과정 또한 흥미로웠다

 

새해에도 꾸준히 공부해서 좋은 결실을 맺길 바란다

화이팅 ~ !