728x90
반응형

< 논리 연산자 이해하기 >

 

> 논리 연산자란?

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
	*/


}
728x90
반응형

+ Recent posts