[C언어 강좌] #6-2 연산자(Operator)


논리 연산자

논리 연산자는 &&|| 와! 가 있습니다.

 

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

 

[C언어 강좌] #5-1 [2진수 변환 및 보수 표현]

안녕하세요 파일입니다. 연산자를 설명하기 전에 생각해보니 2진법 변환 과정을 모르면 전혀 이해가 안 되실 거 같아서 한번 설명을 하겠습니다. 오늘 내용은 조금 난이도가 있습니다. 약간 수학적인 개념이 필요..

pgh268400.tistory.com

 

그다음은 | 연산자를 알아보겠습니다. | 연산자는 비트단위로 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언어에서 꽤나 중요하다고 생각됩니다.

 

이해가 안 되시는 게 있으면 댓글 부탁드립니다. 감사합니다 ^^

COMMENT WRITE