< 논리 연산자 이해하기 >
> 논리 연산자란?
1) 논리 연산자의 개요
(1) 단항 연산자 1개, 이항 연산자 2개
(2) 피연산자를 대상으로 참(True)과 거짓(False)를 구별
(3) 피연산자 : 상수, 변수, 관계식
(4) 참이면 1, 거짓이면 0
항목 | 관계 연산자 | 논리 연산자 |
형식 | 이항 연산자 | 단항 연산자, 이항 연산자 |
동작 | 피연산자의 값을 비교 | 피연산자의 참과 거짓을 비교 |
결과값 | 참이면 1, 거짓이면 0 | 참이면 1, 거짓이면 0 |
2) 논리 연산자의 종류
항목 | 기호 | 형식 | 설명 |
NOT | ! | 단항 연산자 | 피연산자를 부정 |
AND | && | 이항 연산자 | 피연산자 모두 참이면 참 |
OR | || | 이항 연산자 | 피연산자 모두 거짓이면 거짓 |
논리 연산자의 우선 순위 |
NOT > AND > OR |
3) 논리 연산자의 결과 값 예시
피연산자1 | 피연산자2 | NOT(피연산자1) | AND | OR |
거짓 | 거짓 | 참 | 거짓 | 거짓 |
거짓 | 참 | 참 | 거짓 | 참 |
참 | 거짓 | 거짓 | 거짓 | 참 |
참 | 참 | 거짓 | 참 | 참 |
> 논리 연산자의 예
1) 피연산자가 상수인 경우
상수 값에 따른 참과 거짓 판단
- 상수 값이 0이면 거짓
- 상수 값이 0이 아니면 참
// NOT
result = !0; // 1 True
result = !1; // 0 False
result = !2; // 0 False
// AND
result = 0 && 0; // 0 False
result = 0 && 1; // 0 False
result = 1 && 0; // 0 False
result = 1 && 1; // 1 True
// OR
result = 0 || 0; // 0 False
result = 0 || 1; // 1 True
result = 1 || 0; // 1 True
result = 1 || 1; // 1 True
2) 피연산자가 변수인 경우
변수 값에 따른 참과 거짓 판단
- 변수 값이 0이면 거짓
- 변수 값이 0이 아니면 참
// NOT
result = !a;
// AND
result = a && b;
// OR
result = a || b;
#include <stdio.h>
int main(void)
{
int result;
int a, b;
a = 0, b = 1;
// result = !a;
// result = a && b;
// result = a || b;
printf("%d", result);
return 0;
}
3) 피연산자가 관계식인 경우
// NOT
result = !(a < b);
// AND
result = (a > 10) && (b < 20);
// OR
result = (a > 10) || (b < 20);
#include <stdio.h>
int main(void)
{
int result;
int a, b;
//result = !(a < b); // a = 0, b = 1 True(1) → False(0)
//result = (a > 10) && (b < 20); // a = 11, b = 14 True(1)
//result = (a > 10) || (b < 20); // a = 5, b = 14 True(1)
printf("%d", result);
return 0;
}
#include <stdio.h>
int main(void)
{
int result;
int a, b;
a = 12, b = 15;
// 복합적 사용
result = (a > 10) || (b < 20) && !(a < b);
/*
NOT > AND > OR
1. !(a < b) -> (12 < 15) True -> ! -> False
2. (b < 20) -> (15 < 20) True -> True && False -> False
3. (a > 10) -> (12 > 10) True -> True || False -> True
True (1)
1 순위 : 괄호 ( )
2 순위 : 괄호 안 관계 연산자
3 순위 : NOT
4 순위 : AND
5 순위 : OR
6 순위 : 대입연산 (=)
*/
printf("%d", result);
return 0;
}
> 논리 연산자 실습
#include <stdio.h>
int main(void)
{
// 피연산자가 상수인 경우
int result;
result = !0;
printf("%d : result = !0\n", result);
result = !1;
printf("%d : result = !1\n", result);
result = !2;
printf("%d : result = !2\n", result);
result = 0 && 0;
printf("%d : result = 0 && 0\n", result);
result = 0 && 1;
printf("%d : result = 0 && 1\n", result);
result = 1 && 0;
printf("%d : result = 1 && 0\n", result);
result = 1 && 1;
printf("%d : result = 1 && 1\n", result);
result = 0 || 0;
printf("%d : result = 0 || 0\n", result);
result = 0 || 1;
printf("%d : result = 0 || 1\n", result);
result = 1 || 0;
printf("%d : result = 1 || 0\n", result);
result = 1 || 1;
printf("%d : result = 1 || 1\n", result);
// 피연산자가 변수인 경우
printf("\n");
int low = 0, high = 1;
printf("!low = %d\n", !low);
printf("!high = %d\n", !high);
printf("low && low = %d\n", low && low);
printf("low && high = %d\n", low && high);
printf("high && low = %d\n", high && low);
printf("high && high = %d\n", high && high);
printf("low || low = %d\n", low || low);
printf("low || high = %d\n", low || high);
printf("high || low = %d\n", high || low);
printf("high || high = %d\n", high || high);
// 피연산자가 관계식인 경우
int a, b;
printf("\n");
printf("첫번째 피연산자 = "); // 11
scanf_s("%d", &a);
printf("두번째 피연산자 = "); // 21
scanf_s("%d", &b);
printf("!(a < b) = %d\n", !(a < b));
printf("(a < 10) && (b <20) = %d\n", (a > 10) && (b < 20));
printf("(a > 10) || (b < 20) = %d\n", (a > 10) || (b < 20));
printf("(a > 10) || (b < 20) && !(a < b) = %d\n", (a > 10) || (b < 20) && !(a < b));
return 0;
}
< 조건 연산자 이해하기 >
> 조건 연산자란?
조건 연산자의 개요
(1) 삼항 연산자
(2) 피연산자의 역할
result = (조건식) ? (상수값, 변수, 수식) : (상수값, 변수, 수식);
- 첫번째 피연산자 : 조건식 (참 또는 거짓)
- 두번째 피연산자 : 조건식이 참인 경우 수행하는 상수값, 변수, 수식
- 세번째 피연산자: 조건식이 거짓인 경우 수행하는 상수값, 변수, 수식
- ? (물음표) 와 : (콜론) 은 피연산자를 구분짓는 기호이므로 생략 할 수 없다.
> 조건 연산자 사용 예
1) 피연산자가 상수값인 경우
result = (a < b) ? 10 : 20;
- 조건식이 참인 경우 : result = 10
- 조건식이 거짓인 경우 : result = 20
2) 피연산자가 변수인 경우
result = (a < b) ? a : b;
- 조건식이 참인 경우 : result = a
- 조건식이 거짓인 경우 : result = b
→ 변수 a와 b 중에 작은 값이 result 변수에 대입됨
3) 피연산자가 수식인 경우
result = (a < b) ? b - a : a - b;
- 조건식이 참인 경우 : result = b - a
- 조건식이 거짓인 경우 : result = a - b
→ 변수 a와 b 중에 큰 값에서 작은 값을 뺀 결과 값이 result 변수에 대입됨
> 조건 연산자 실습
#include <stdio.h>
int main(void)
{
int a, b, result;
printf("첫번째 값 = ");
scanf_s("%d", &a); // 15
printf("두번째 값 = ");
scanf_s("%d", &b); // 8
result = (a > b ? a : b);
printf("둘 중 큰 값은 %d 입니다\n", result);
result = (a < b ? a : b);
printf("둘 중 작은 값은 %d 입니다\n", result);
result = (a > b ? a - b : b - a);
printf("큰 값에서 작은 값을 뺀 값은 %d 입니다\n", result);
/*
첫번째 값 = 15
두번째 값 = 8
둘 중 큰 값은 15 입니다.
둘 중 작은 값은 8 입니다.
큰 값에서 작은 값을 뺀 값은 7 입니다
*/
return 0;
}
< 비트 연산자 이해하기 >
> 비트 연산자란?
1) 비트 연산자의 개요
(1) 데이터를 비트 (bit) 단위로 연산
- C 언어의 특징 중 하나인 로우 레벨(low level) 제어 가능
(2) 종류
비트 논리 연산자, 비트 시프트(shift) 연산자
종류 | 항목 | 기호 | 형식 | 설명 |
비트 논리 연산자 |
NOT | ~ | 단항 연산자 | 비트 반전 (0 → 1, 1 → 0) |
AND | & | 이항 연산자 | 피연산자가 모두 1인 경우만 1 | |
OR | | | 피연산자가 모두 0인 경우만 0 | ||
XOR | ^ | 피연산자가 서로 다르면 1 | ||
시프트 연산자 |
왼쪽 시프트 |
<< | 왼쪽으로 비트 이동 | |
오른쪽 시프트 |
>> | 오른쪽으로 비트 이동 |
2) 비트 논리 연산자의 결과값
피연산자1 | 피연산자2 | NOT ~ (피연산자1) |
AND & | OR | | XOR ^ |
0 | 0 | 1 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 0 | 1 | 1 |
1 | 1 | 0 | 1 | 1 | 0 |
> 비트 연산자 예
1) 비트 NOT 연산
(1) 부호 없는 자료형 예
unsigned char value = 1;
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
* 비트 반전
unsigned char result = ~value; // result = 254
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
(2) 부호 있는 자료형 예
char value = 1;
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
* 비트 반전
char result = ~value; // result = -2
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
*** 가장 앞 쪽의 부호비트가
- 양수인 경우 : 0
- 음수인 경우 : 1
음수는 2의 보수로 표현됨
2) 비트 AND 연산
- 논리곱의 형태로 계산됨
int value_1 = 3;
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
int value_2 = 5;
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
int result = value_1 & value_2; // result = 1
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
& | & | & | & | & | & | & | & |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
= | = | = | = | = | = | = | = |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
3) 비트 OR 연산
- 논리합의 형태로 계산됨
int value_1 = 3;
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
int value_2 = 5;
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
int result = value_1 | value_2; // result = 7
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| | | | | | | | | | | | | | | |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
= | = | = | = | = | = | = | = |
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
4) 비트 XOR 연산
- 배타적 논리합의 형태로 계산됨
int value_1 = 3;
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
int value_2 = 5;
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
int result = value_1 ^ value_2; // result = 6
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
^ | ^ | ^ | ^ | ^ | ^ | ^ | ^ |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
= | = | = | = | = | = | = | = |
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
5) 왼쪽 시프트 연산
int value = 3;
int result = value << 1; // result = 6
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
↙ | ↙ | ↙ | ↙ | ↙ | ↙ | ↙ | |
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
* 3 을 왼쪽으로 1 비트 시프트하면 6이 되는데, 이는 3 에 2 를 곱한 값이 된다.
그러므로 왼쪽 1 비트 시프트는 곱하기 2 의 의미가 있다.
6) 오른쪽 시프트 연산
int value = 6;
int result = value >> 1; // result = 3
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
↘ | ↘ | ↘ | ↘ | ↘ | ↘ | ↘ | |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
* 3을 오른쪽으로 1 비트 시프트하면 3이 되는데, 이는 6 에 2를 나눈 값이 된다.
그러므로 오른쪽 1 비트 시프트는 나누기 2 의 의미가 있다.
> 비트 연산자 실습
#include <stdio.h>
int main(void)
{
// 비트 NOT 연산 (부호 없는 자료형)
unsigned char value_1 = 1;
unsigned char result_1 = ~value_1;
printf("NOT unsigned : value = %d, result = %d\n", value_1, result_1);
// 비트 NOT 연산 (부호 있는 자료형)
char value_2 = 1;
char result_2 = ~value_2;
printf("NOT signed : value = %d, result = %d\n", value_2, result_2);
// 비트 AND 연산
int op_1 = 3; // 011
int op_2 = 5; // 101
int result = op_1 & op_2; // 001
printf("AND : op_1 = %d, op_2 = %d, result = %d\n", op_1, op_2, result);
// 비트 OR 연산
int op_1 = 3; // 011
int op_2 = 5; // 101
int result = op_1 | op_2; // 111
printf("OR : op_1 = %d, op_2 = %d, result = %d\n", op_1, op_2, result);
// 비트 XOR 연산
int op_1 = 3; // 011
int op_2 = 5; // 101
int result = op_1 ^ op_2; // 110
printf("XOR : op_1 = %d, op_2 %d, result = %d\n", op_1, op_2, result);
// 왼쪽 시프트
op_1 = 3; // 011
result = op_1 << 1; // 110
printf("SHIFT << : op_1 = %d, result = %d\n", op_1, result);
// 오른쪽 시프트
op_1 = 6; // 110
result = op_1 >> 1; // 011
printf("SHITF >> : op_1 = %d, result = %d\n", op_1, result);
return 0;
}
< 프로그램 작성 >
- 다음 요구내용을 비주얼스튜디오에서 작성하고 실행하시오.
1) 두 개의 숫자를 입력받으시오.
2) 두 개의 숫자에 대하여 홀수와 짝수를 구분하여 출력하시오.
3) 10에서 20 사이의 값인지 여부를 출력하시오.
4) 두 개의 숫자에 대하여 비트 AND, OR, XOR 값을 출력하시오.
#include <stdio.h>
int main(void)
{
int a, b;
printf("첫번째 값을 입력하시오 : ");
scanf_s("%d", &a);
printf("두번째 값을 입력하시오 : ");
scanf_s("%d", &b);
printf("첫번째 값 = %d\n", a);
printf("두번째 값 = %d\n", b);
// 홀수와 짝수 구분
int oddEven = a % 2;
char *msg = (oddEven == 0) ? "짝수" : "홀수";
printf("첫번째 값 %d는 %s 입니다.\n", a, msg);
msg = (b % 2 == 0) ? "짝수" : "홀수";
printf("두번째 값 %d 는 %s 입니다.\n", b, msg);
// 10 에서 20 사이의 값 계산
printf("첫 번째 값 %d는 10에서 20사이의", a);
int result = (a >= 10 && a <= 20) ? printf("값입니다.\n") : printf("값이 아닙니다.\n");
printf("두 번째 값 %d는 10에서 20사이의", b);
result = (b >= 10 && b <= 20) ? printf("값입니다.\n") : printf("값이 아닙니다.\n");
// 비트 연산
printf("%d & (AND) %d = %d\n", a, b, a & b);
printf("%d | (OR) %d = %d\n", a, b, a | b);
printf("%d ^ (XOR) %d = %d\n", a, b, a ^ b);
return 0;
/*
첫번째 값 = 5
두번째 값 = 12
첫번째 값 5 는 홀수 입니다.
두번째 값 12 는 짝수 입니다.
첫번째 값 5는 10에서 20사이의 값이 아닙니다.
두번째 값 12는 10에서 20사이의 값입니다.
5 &(AND) 12 = 4
5 |(OR) 12 = 13
5 ^(XOR) 12 = 9
*/
}
'Language > C & C++' 카테고리의 다른 글
C_06. Basic Grammar of Iteration Statement (0) | 2022.08.10 |
---|---|
C_05. Basic Grammar of Conditional Statement (0) | 2022.08.10 |
C_03. Basic Grammar of Arithmetic and Relational Operator (0) | 2022.08.08 |
C_02. Basic Grammar of Data Type and Variable (0) | 2022.08.02 |
C_01. Intro (0) | 2022.08.01 |