논리 연산자
논리 연산자는 && 와 || 와! 가 있습니다.
AND 연산자 (&&)
피연산자 | 피연산자 | 결과값 |
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
AND 연산자는 피연산자가 모두 참(1) 일 때 참을 반환합니다.
AND 연산자의 의미는 논리곱입니다.
수학의 집합으로 생각하면 교집합의 개념입니다.
OR 연산자 ( || )
피연산자 | 피연산자 | 결과값 |
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
OR 연산자는 피연산자 중 하나가 참이면 참을 반환합니다.
OR 연산자의 의미는 논리합입니다.
수학의 집합으로 생각하면 합집합의 개념입니다.
#include <stdio.h>
int main(){
int a = 10;
int b = 5;
printf("%d 가 %d 보다 큰가 ? : %d \n", a,b , a > b);
printf("%d 가 %d 보다 작은가 ? : %d \n", a,b , a < b);
a = 5;
b = 5;
printf("%d 가 %d와 같은가 ? : %d \n", a, b, a==b);
printf("%d 가 %d와 다른가? : %d \n", a, b, a!=b);
a = 10;
b = 5;
int result1 = (a>b) || (a < b);
int result2 = (a>b) && (a < b);
printf("%d 가 %d 보다 큰가 ? , %d 가 %d 보다 작은가? : Or 연산 : %d \n", a,b,a,b , result1);
printf("%d 가 %d 보다 큰가 ? , %d 가 %d 보다 작은가? : And 연산 : %d", a,b,a,b , result2);
return 0;
}
10 가 5 보다 큰가 ? : 1
10 가 5 보다 작은가 ? : 0
5 가 5와 같은가 ? : 1
5 가 5와 다른가? : 0
10 가 5 보다 큰가 ? , 10 가 5 보다 작은가? : Or 연산 : 1
10 가 5 보다 큰가 ? , 10 가 5 보다 작은가? : And 연산 : 0
--------------------------------
Process exited after 0.02948 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
조금 난해하긴 하지만 저번 소스코드를 이용해 AND 연산자와 OR연산자를 사용해봤습니다.
1과 0을 || 연산하면 참이 하나라도 있으므로 1을 반환,
1과 0을 && 연산하면 하나가 거짓이므로 0 을 반환합니다.
NOT 연산자(!)
피연산자 | 결과값 |
1 | 0 |
0 | 1 |
! 연산자는 참과 거짓을 뒤바꿉니다.1을! 연산자를 사용하면
0을! 연산자를 사용하면 1입니다.
저번에!= 를 보셨을 건데 여기서! 이 NOT의 의미입니다.
조건 연산자(삼항 연산자)
조건 연산자(?) 하나의 사진으로 나타낸 사진입니다.
조건식이 참이면 식 1번이 실행되고 거짓이면 식 2번이 출력됩니다.
항이 3개기 때문에 삼항 연산자라고 합니다.
#include <stdio.h>
int main(){
//더 큰수 출력하기
int a , b;
printf("첫번째 수를 입력해주세요 : ");
scanf("%d", &a);
printf("두번째 수를 입력해주세요 : ");
scanf("%d", &b);
int result = (a > b) ? a : b;
printf("더 큰수는 : %d 입니다", result);
return 0;
}
첫번째 수를 입력해주세요 : 999
두번째 수를 입력해주세요 : 1000
더 큰수는 : 1000 입니다
--------------------------------
Process exited after 2.433 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
다음 예제는 삼항 연산자를 이용해 정수 2개를scanf로 입력받고 큰 수를 출력하는 예제입니다
a > b로 비교하고 참이면 result의 값은 a가 됩니다. 그리고 거짓이면 b가 더 큰 것이므로 result의 값은 b가 됩니다.
이제 result의 값을 출력하면 큰 수가 출력되게 되는 것입니다.
비트 연산자
이번 강의의 핵심입니다.. 저번에 추가로 강의를 작성한 것도 이 비트 연산을 위해서 인데요.
노트 하나 지참하시고 하나하나 써보면서 직접 계산해보세요~~
컴퓨터에서 사용하는 정보 단위 중 가장 작은 단위는비트입니다.
1 비트는 2진수 값 하나 (0 또는 1)을 저장할 수 있는 최소 메모리 공간입니다.
각 비트다 경우의 수 2개(0,1)를 나타낼 수 있으므로
1비트는 2개, 2비트는 4개, 3비트는 8개 n비트는 2의 n제곱만큼 경우의 수를 나타낼 수 있습니다.
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
비트 8개를 모으면 1바이트입니다.
28(256) 개의 경우의 수만큼 나타낼 수 있겠죠?
비트 연산자 | 연산식 | 설명 |
& | a & b | 비트단위 AND 연산 |
| | a | b | 비트단위 OR 연산 |
^ | a ^ b | 비트단위 XOR 연산 |
~ | ~a | 비트단위 NOT 연산 |
<< | a << n | 왼쪽으로 n칸이동 |
>> | a >> n | 오른쪽으로 n칸 이동 |
비트 연산자의 종류입니다. 논리 연산자와 구분하기 위해서 한 가지 문자를 썼네요. ( && -> &)
우선 & 연산자부터 보겠습니다.
#include <stdio.h>
int main(){
int n1 = 30;
int n2 = 20;
int result = n1 & n2; //30과 20 비트단위 연산
printf("Result : %d", result);
}
Result : 20
--------------------------------
Process exited after 0.01711 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
값이 20이 나왔네요. 그냥 받아들이면 안 되고 왜 20이 나오는지 알아야겠죠?
20을 이진수로 바꿉니다.
0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
30도 이진수로 바꿉니다
0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |
& 연산할 땐 아까 논리 연산자 &&와 동일합니다.
참, 참에서만 참을 반환하고 이외에는 전부 거짓을 반환합니다.
단 비트단위, 세로로 AND 연산을 진행하시면 됩니다.
0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
이렇게 해서 결괏값은 20 이 나옵니다.
이게 무슨 소린지 모르시겠다면 아래 강의를 보고 오세요.
https://pgh268400.tistory.com/20?category=1072473
그다음은 | 연산자를 알아보겠습니다. | 연산자는 비트단위로 OR연산을 합니다.
#include <stdio.h>
int main(){
int n1 = 10;
int n2 = 7;
int result = n1 | n2;
printf("Result : %d", result);
}
Result : 15
--------------------------------
Process exited after 0.01727 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
= 10
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
= 7
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
= 15
다음으로 ^ 연산자입니다. 비트 단위로 XOR 연산을 수행합니다.
피연산자 | 피연산자 | 결과 |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
XOR는 두 비트가 다르면 참을 반환합니다. (같으면 거짓입니다.)
XOR을 설명할땐 보통 두가지 방법으로 설명하는데 우선 첫번째로 XOR은 Exclusive OR 의 줄임말로 Exlusive(배제하는) 이라는 단어가 OR 연산에 붙은 형태입니다. OR은 사실 Inclusive(포함하는) OR 을 줄여서 말하는 것이구요.
XOR == Exclusive OR인데 OR에서 무언가를 배제했다는 것으로 해석할 수 있습니다. 과연 무엇을 배제했을까요? XOR은 실제로 위의 표를 보면 알겠지만 OR 연산과 다 똑같으나 딱 마지막 한 부분만 다릅니다. 바로 비트가 1 1 로 똑같을때 OR연산의 경우 하나라도 참이면 무조건 참이라 1 1 은 당연히 참이였지만 XOR의 경우 1 1 로 비트가 같으면 거짓이 되게 됩니다.
1 1 로 비트가 같은걸 배제 (Exclusive) 한것이 바로 XOR연산입니다.
*배제 했다는건 거짓값 0이 나온다는것과 같은 의미로 해석하시면 됩니다.
두번째로 1 1 로 비트가 같은걸 배제 했기 때문에 XOR연산의 표를 보시면 알겠지만 비트가 다른 경우 참이고 같으면 거짓이 되게 됩니다. 이러한 성질을 이용해서 두 비트가 같은지 다른지 계산하는데 활용할 수 있겠습니다.
#include <stdio.h>
int main(){
int n1 = 14;
int n2 = 30;
int result = n1 ^ n2;
printf("Result : %d", result);
}
Result : 16
--------------------------------
Process exited after 0.3822 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 |
= 14
0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |
= 30
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
= 16
~연산자는 비트 단위 NOT 연산을 수행하며 보통 보수 연산이라고도 합니다.
(0 ->1 , 1->0)
#include <stdio.h>
int main(){
int n1 = 22;
int result = ~n1;
printf("Result : %d", result);
}
Result : -23
--------------------------------
Process exited after 0.384 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
= 22
1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
= -23
~22는 결괏값이 - 23이고
2진수로 1 1 1 0 1 0 0 1입니다. 그런데 이게 -23인지 어떻게 알까요?
컴퓨터는 뺄셈을 할 때 2의 보수를 이용하여 계산을 한다고 했습니다.
음수 값을 거꾸로 2의 보수로 취하면 양수 값이 나오고 그것이 23인걸 확인할 수 있을 겁니다.
0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
-23의 1의 보수 (22)
0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 |
-23의 2의 보수 (+1) = 23
23이 맞네요 ^^
마지막으로 << 연산자와 >> 연산자입니다.
시프트 연산자라고도 하는데 비트를 n칸씩 이동시킵니다.
#include <stdio.h>
int main(){
int n1 = 20;
printf("%d \n", n1 << 1);
printf("%d", n1 << 2);
return 0;
}
40
80
--------------------------------
Process exited after 0.01566 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
#include <stdio.h>
int main(){
int n1 = 20;
printf("%d \n", n1 >> 1);
printf("%d", n1 >> 2);
return 0;
}
10
5
--------------------------------
Process exited after 0.01651 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
<< 는 비트를 왼칸으로 이동시키고 빈 공간은 0으로 채웁니다.
한 칸씩 옮기고 0이 추가됨으로 왼쪽(<<)으로 옮길 땐 2배씩 증가하고
오른쪽(>>)으로 옮길땐 1/2 배씩 증가합니다.
#include <stdio.h>
int main(){
int n1 = -20;
printf("%d \n", n1 >> 1);
printf("%d", n1 >> 2);
return 0;
}
-10
-5
--------------------------------
Process exited after 0.01507 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
음수의 경우에는 옮길 때 빈 메모리 공간에 1을 추가해줍니다.
어떤가요? 개인적으로 비트 연산에 대한 이해가 C언어에서 꽤나 중요하다고 생각됩니다.
이해가 안 되시는 게 있으면 댓글 부탁드립니다. 감사합니다 ^^
'프로그래밍 강좌 > C' 카테고리의 다른 글
[C언어 강좌] #7-2 자료형(Data Type) (0) | 2019.11.24 |
---|---|
[C언어 강좌] #7-1 자료형(Data Type) (0) | 2019.11.19 |
[C언어 강좌] #6-1 연산자(Operator) (4) | 2019.11.14 |
[C언어 강좌] #5-2 [2진수 변환, 1의보수, 2의보수 원리 설명] (0) | 2019.11.12 |
[C언어 강좌] #5-1 상수 이용하기(Constant) (0) | 2019.11.10 |