-
[삼쾌한 IT강의] 논리부정, 디지털 논리연산, 비트연산자JAVA/이론 2019. 1. 13. 22:35
안녕하세요! 삼쾌한 IT강의 백소라 강사입니다.
이번 포스팅에서도 계속해서 연산자의 종류에 대해 알아보도록 하겠습니다.
1. 논리부정 연산자
논리부정 연산자는 스위치 역할, 즉 전원을 켜고 끄듯이 논리 값 TRUE 와 FALSE를 바꿔주는 역할을 합니다. 이번에도 예시로 확인을 해볼까요?
boolean test = true; // 논리 연산자 변수 test를 true값으로 선언 및 초기화
test = !test; // test에 논리부정 연산자 ! 를 사용, 값을 변경 --> test == false
test = !test; // 다시 test에 논리부정 연산자 ! 를 사용, 값을 변경 --> test == true
자, 이렇게 논리부정 연산자 !는 참/거짓의 논리를 켜고 끄는 역할을 한다고 보면 되겠죠? 이 논리부정 연산자는 곧 배우게 될 반복문에서 많이 사용하게 됩니다. 참고로 논리 연산자의 기본값은 false이니 기억 해 두세요 !
2. 비트 연산자
비트 연산자를 설명하기 전에, 우선 컴퓨터의 데이터 저장 방식부터 간단하게 이야기 해 보도록 하겠습니다. 우리 사람은 십진수 즉 0 부터 9까지의 숫자를 이용하지만, 컴퓨터는 0 과 1 두가지 숫자만 인식을 할 수 있습니다. 이 두가지 숫자를 저장하는 최소의 단위를 1 bit라고 합니다. 그리고 이 비트들이 모여 8비트가 되면, 우리는 이 8비트를 1바이트로 부릅니다. 마치 1,000그람을 1킬로그람이라고 하는 것 처럼요.
1 바이트
0
0
0
0
1
0
1
0
비트 연산은 1바이트, 즉 8비트로 연산을 하는 것을 말합니다. 비트연산도 우리가 알고있는 사칙연산으로 값을 계산할까요? 아닙니다. 비트 연산은 and, or, xor과 같은 논리 연산, 그리고 뒤에 함께 배울 시프트 연산을 이용할 수 있습니다.
3. 디지털 논리연산
디지털 논리연산을 설명하기 전에, 아래의 회로를 잠깐 볼까요?
우리에게 익숙한 직렬, 병력 회로죠? 디지털 논리연산에는 and, or, xor 연산이 있는데 이 회로와 함께 설명을 드리면 쉽게 이해할 수 있습니다. 우리는 첫번째 회로에서 A 와 B 가 모두 닫혀있을 때, 즉 전기가 흐를 때, 두 값이 모두 1일 때 결과가 1, 즉 전기가 흐른다고 알고있습니다. 이런 직렬회로를 AND 연산이라고 할 수 있습니다.
OR연산은 병렬회로를 보시면 됩니다. A 나 B 둘중 하나라도 닫혀있으면, 즉 두 값중 하나라도 1일 때 결과가 1, 즉 전기가 흐른다 라고 알고있죠.
마지막 회로는 어떨까요? 마지막 회로는 XOR 연산과 동일합니다. 우리가 과전류가 흐르거나 충돌을 일으키지 않기 위해 적절히 조절을 해야하는데, 이는 A 와 B 가 불일치 하는 경우만 전기가 흐르도록 즉 결과값 1이 나오도록 하는겁니다.
자, 회로도를 논리연산으로 보자면 아래처럼 이름을 지어줄 수 있습니다.
논리 연산의 결과는 아래와 같이 입력 값과 적용 연산 (AND, OR, XOR)에 따라 아래와 같이 확인할 수 있습니다. 사실 디지털 논리연산에는 AND, OR, XOR 외에 NOT AND, NOT OR이 있습니다. NOT AND와 NOT OR은 이름에서 유추할 수 있듯이 각각 AND의 반대 결과와 OR의 반대 결과를 나타냅니다.
4. 비트 논리연산
자, 2번과 3번은 비트 논리연산, 비트 시프트연산을 위해 설명했다고 해도 과언이 아닌데요. 비트 논리연산은 8비트로 AND, OR, XOR연산을 하는겁니다. 다시 예를 들어볼까요?
int num1 = 5; // 십진수 5는 이진수로 00000101 입니다.
int num2 = 10; // 십진수 10은 이진수로 00001010 입니다.
int result = num1 & num2; // 두 수를 & 연산 하면 00000000 입니다.
AND 연산은 A 와 B 값 모두 1일 때 결과값이 1이 나오는데, 이진수로 변환한 5와 10은 각 자리를 매칭 해 봤을 때 모두 1인 경우가 없기 때문에 result 변수에는 0이 대입되게 됩니다. 위의 예시에서 & 를 | 이나 ^ 로 변경했을 때 result 에 어떤 값이 대입이 될지 생각 해 보시기 바랍니다!
참고로 비트 논리연산에서 AND, OR, XOR 은 &, |, ^ 로 표기하고, 일반 논리연산에서는 &&, || 로 표기합니다.
5. 비트 시프트연산
비트 시프트연산은 논리연산보다 훨씬 쉬운 개념입니다. 시프트연산은 아래처럼 나타낼 수 있습니다.
int num = 0B00000101; //십진수 5를 이진수로 나타냄.
num = num << 2; // 대입 된 비트 00000101을 왼쪽으로 2칸 이동 --> 00010100
num = num >> 2; // 대입 된 비트 00010100을 오른쪽으로 2칸 이동 --> 00000101
num << 2 는 num에 대입 된 비트를 왼쪽으로 2비트 만큼 이동하겠다는 뜻이고, num >> 2 는 반대로 오른쪽으로 2비트 만큼 이동하겠다는 뜻입니다. 참 직관적이고 쉽죠? 그런데 왜 비트 시프트연산을 사용하고 어떤때 사용할까요?
num << n 은 num * 2n과 같습니다.
num >> n 은 num / 2n과 같습니다.
비트 시프트 연산은 위와 같은 효과가 있습니다. 그러면 왜! 굳이! 시프트 연산을 사용해야할까요? 이 방법은 컴퓨터가 더 알아듣기 쉬운 방법이기 때문에 빠른 실행속도를 위해 큰 프로젝트에서 사용한다, 라고 생각을 하시면 될 것 같습니다.
6. 실습 해보기
논리부정, 비트연산자 : 2019/01/12 - [JAVA/실습예제] - [삼쾌한 예제] 복합대입, 논리부정, 비트연산자
논리비교, 시프트연산자 : 2019/01/12 - [JAVA/실습예제] - [삼쾌한 예제] 논리비교 연산, 쉬프트연산, 삼항연산
이상 유쾌,상쾌,통쾌 삼쾌한 IT강의, 백소라 강사의 자바 연산자 설명을 마치겠습니다.
내용이 도움이 되셨다면 공감버튼 클릭, 댓글은 센스! 감사합니다.
'JAVA > 이론' 카테고리의 다른 글
[삼쾌한 IT강의] 자바 반복문의 의미와 종류 (0) 2019.01.22 [삼쾌한 IT강의] 자바 제어문(조건문)의 의미와 종류 (0) 2019.01.13 [삼쾌한 IT강의] 산술연산자, 증감연산자, 복합대입 연산자 (0) 2019.01.13 [삼쾌한 IT강의] 자바 연산자 종류와 우선순위 (0) 2019.01.13 [삼쾌한 IT강의] BufferedReader와 Scanner 사용법 (0) 2019.01.10 댓글