[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

  1. 비밀댓글입니다

    • 안녕하세요. 제 강의글로 도움이 되셨다니 저야 기쁩니다 ^^ 초보자도 읽을수 있게 제로부터 제작한다고 했는데 이부분은 내용이 조금 길어져서 대강 넘어간 부분이 조금 있습니다!

      C언어에서는 10 이라는 이진수
      1 0 1 0 을 -10이라고 표현할땐 2의 보수처리를 통해 0 1 1 1 라고 표현하기로 약속했습니다.

      실제로 보수로 수를 계속 만들어봐도
      음수값 따위는 만들수 없지만 "읽을때는" 그렇게 읽기로 약속한겁니다.
      컴퓨터가 느끼기에
      8 - 3에서 -3은 3의 보수인 7로써 인식하게 되니깐요.

      계산에 대한 과정은 #5-1에서 설명한 부분이구요.

      포스팅에선 -23이 not 연산을
      시행하면 1 1 1 0 1 0 0 1 인데
      이게 -23인지 알아보기 힘듭니다
      -23이라는 표현은 23을 2의 보수 처리해서 나타낸것이죠?

      그렇기 때문에 -23을 2의 보수 연산을 거치게 되면

      부호가 뒤집히게되고 23이 되어 -23이 1 1 1 0 1 0 0 1 이라는걸 간접적으로 증명한 셈이 되는겁니다 ^^

      보수를 한번더 취하면 원래 숫자로 돌아오는건 10진수 숫자 하나를 생각해보면 편합니다.

      10진수 숫자 6이라는 숫자를 10의보수 처리하면 4, 이걸 다시 10의 보수 처리하면 6이라는 원래 숫자로 돌아오게 됩니다.

      강의는 현재 C언어의 어려운 부분인 배열, 포인터만 남아있는데 이걸 어떻게 쉽게 풀어서 쓸지 고민중에 있습니다 ㅠㅠ 구독감사드리고 항상 많은 도움이 되셨으면 좋겠습니다.

    • 햇갈리시면 이영상을 보면 도움이 되실거에요. https://www.youtube.com/watch?v=1OVf_Wu8uC4&t=779s

  2. 비밀댓글입니다