C언어 연산자
C언어에서 혼동되기 쉬운 논리, 비트 연산자의 차이와 사용 예시를
살펴보고, 두 연산자를 비교해보는 내용을 다루어보겠습니다.
먼저, 논리 연산자와 비트 연산자의 특징을 정리하면 아래 표와 같습니다.
이제 C언어에서 실제로 사용되는 예시를 보며, 사용 방법과 결과 출력이 어떻게
실제로 진행되는지를 살펴보도록 하겠습니다.
C언어 논리 연산자 : &&, ||, !
먼저, C언어에서의 True, False 조건에 대해서 살펴보겠습니다.
C언어에서는 기본 자료형으로 boolean 자료형을 취급하지는 않는 대신,
정수 1을 True처럼, 정수 0을 False처럼 사용하게 됩니다.
또한, int 자료형을 기준으로 0을 제외한 모든 값은 True로 인식을 합니다.
아래 예제에서 True와 False로 취급되는 대표적인 예시를 살펴보겠습니다.
#include <stdio.h>
int main(){
int a = 1; // True 취급
int b = 0; // False 취급
int c = -2; // True 취급
int aANDc = a && c; // True and True -> True : 1 할당
int aANDb = a && b; // True and False -> False : 0 할당
int aORb = a || b; // True or False -> True : 1 할당
int NOTa = !a; // not True -> False : 0 할당
int aBIGb = a > b; // 1 > 0 -> True : 1 할당
int aEQUALc = a == c; // 1 == -2 -> False : 0 할당
}
위 4개의 예시는 논리연산자인 &&, ||, ! 를 통하여 boolean 연산을
int 자료형에서 간접적으로 진행한 예시이고,
아래 2개의 예시는 대소 비교나 동등 비교의 실제 결과가
boolean 처럼 저장된 형태를 나타냈습니다.
이제, 대소 비교 등의 결과에 대해서 boolean 연산을 진행해보고,
또한 비교 대상이 3개 이상인 경우도 살펴보겠습니다.
#include <stdio.h>
int main(){
int a = 1;
int b = 0;
int c = -2;
int d = (a > b) && (a >= c); // True and True -> True : 1 할당
int e = (a == b) || (b < c); // False or False -> False : 0 할당
int f = (a || b) && (a != c); // (True or False) and True -> True : 1 할당
int g = (!(a < c)) && c; // (not False) and True -> True : 1 할당
}
비교 연산의 결과가 True / False이냐를 기준으로도 마찬가지 논리 연산이
가능하며, 비교 대상이 3개 이상인 경우는 괄호로 원하는 순서대로 묶어서
복잡한 논리 연산도 얼마든지 수행할 수 있습니다.
C언어 비트 연산자 : &, |, ~, ^
이번에는 AND와 OR은 기호 2개 대신 1개가 사용되고, NOT은 ! 대신 ~를 사용하며,
새로운 연산 방법인 XOR 연산이 추가된 비트 연산을 살펴보겠습니다.
조건을 직접 연산하는 대신, 여기서는 실제로 값이 저장된 비트를 기준으로
각 비트마다 연산을 수행하게 됩니다.
예를 들어 int형 자료인 경우는 4바이트, 즉 32비트로 2진수형태로 값이 저장되는데,
맨 앞의 숫자는 부호를 나타내고 그 뒤에 31개 숫자가 값을 나타냅니다.
각 연산의 뜻은 맨 위 사진에서 설명해드렸으니, 여기서는 실제 예제를 통하여
결과가 출력되는 과정을 이해해보시기를 바라겠습니다.
먼저 and 연산 예시입니다.
#include <stdio.h>
int main(){
int a = 15; // 00000000 00000000 00000000 00001111
int b = 21; // 00000000 00000000 00000000 00010101
int c = a & b; // 00000000 00000000 00000000 00000101 -> 5
printf("%d", c); // 5 출력
}
맨 끝 자리와, 끝에서 3번째 자리만 15와 21 숫자 두 경우 모두 1이기에,해당 두 자리 숫자만 1로 살아남아 최종 5라는 값이 되었습니다.
이번에는 or 연산의 예시입니다.
#include <stdio.h>
int main(){
int a = 15; // 00000000 00000000 00000000 00001111
int b = 21; // 00000000 00000000 00000000 00010101
int c = a | b; // 00000000 00000000 00000000 00011111 -> 31
printf("%d", c); // 31 출력
}
15와 21 두 숫자 중 한 곳이라도 1인 비트는 맨 끝의 5자리입니다.따라서, 해당 5자리가 1로 나타나게되고, 최종 결과 값은 31이 됩니다.
다음은 not 연산의 예시입니다.
#include <stdio.h>
int main(){
int a = 15; // 00000000 00000000 00000000 00001111
int b = ~a; // 11111111 11111111 11111111 11110000 -> -16
printf("%d", b); // -16 출력
}
0인 경우는 1로, 1인 경우는 0으로 바뀌어서
최종 결과가 아래와 같은 비트가 되었습니다.
이 값은 -16을 나타내는데, 첫 자리가 1이라서 음수를 표현하게 되었으며,
음수 비트 표현 방법에 따르면 -16이 됩니다. 이 방법은 이 포스팅에서는
자세히 다루지는 않도록 하겠습니다.
마지막으로 xor 연산의 결과입니다.
#include <stdio.h>
int main(){
int a = 15; // 00000000 00000000 00000000 00001111
int b = 21; // 00000000 00000000 00000000 00010101
int c = a^b; // 00000000 00000000 00000000 00011010 -> 26
printf("%d", c); // 26 출력
}
15와 21 두 숫자에서 둘 중 하나는 1, 나머지는 0을 가리키는 위치의 비트만
1로 남은 결과가 출력되었습니다.
물론, 비트 연산자도 3개 이상의 비교 대상에 사용하거나
심지어는 논리 연산자 등과 혼합하여 사용하는 것이 가능하지만,
여기서 추가적인 복잡한 예제는 생략하도록 하겠습니다.
또한, 연산자 혼합 사용 시 연산자의 우선 순위표가 있기는 하나,
다 외워서 사용하기에는 다소 복잡하여 원하는 순서대로 괄호를 쳐서
혼동 없이 사용하시는 것을 권장하도록 하겠습니다.
'C & C++' 카테고리의 다른 글
[C언어] 문자열에서 많이 사용되는 함수 : strlen, strcpy, strcat, strcmp (1) | 2021.12.13 |
---|---|
[C언어] 배열(Array) 구조 선언, 할당, 포인터 연산, 출력 예제 (0) | 2021.12.07 |
[C언어] 포인터, 이중포인터 개념, 실습 예제 완벽 이해 (1) | 2021.12.07 |