c언어 비트 연산자에 대하여 알아보기
네 안녕하세요, 이번 포스팅에서는 비트 연산자에 대하여 알아보는 시간을 가져보도록 하겠습니다.
우리가 쓰는 디지털 기기들, 그리고 여러 가지 프로그램들은 모두 비트로 이루어져 있습니다.
그래서 결국에는 이 비트 연산이 기본으로 깔리게 됩니다.
물론 요즘에는 연산자들이 체계화가 되어있어서 이를 잘 쓰지 않지만,
이걸 모른다는 것은 프로그램을 모른다는 것과도 직결이 됩니다.
그래서 이번 시간에는 이 비트 연산자의 종류가 어떤 것이 있으며, 그 쓰임새는 어떠한 지에 대하여 알아보도록 하겠습니다.
2. 비트 연산자의 종류
비트 연산자는 크게 6가지 연산자가 존재를 합니다.
제가 표로 정리를 해뒀습니다.
연산자 | 의미 | 예시 |
& | 비트 and | 서로 다른 피연산자가 모두 1이면 1, 하나라도 0이면 0(논리곱) |
| | 비트 or | 서로 다른 피연산자 중 하나라도 1이면 1, 둘 다 0이면 0(논리합) |
^ | 비트 xor | 서로 다른 피연산자의 값이 같으면 0, 아니면 1 |
<< | 왼쪽으로 이동 | 지정된 개수만큼 왼쪽으로 이동 |
>> | 오른쪽으로 이동 | 지정된 개수만큼 오른쪽으로 이동 |
~ | 비트 not | 피연산자의 비트가 1이면 0, 0이면 1 |
이렇게 정리를 해봤습니다.
그럼 이 순서대로 한 번 알아보도록 하겠습니다.
1 - 1. 비트 and(&)
비트 and 연산자는 비트 단위로 and 연산을 하는 연산자입니다.
그리고 이는 피연산자가 모두 1일 경우에만 1을 출력하고, 하나라도 0이라면 0을 출력하므로,
다른 말로 '논리곱' 이라고도 합니다.
다음은 and 연산자의 진리치 표 입니다.
논리식 | 결과 |
0 & 0 | 0 |
0 & 1 | 0 |
1 & 0 | 0 |
1 & 1 | 1 |
이렇게 쓸 수 있습니다.
그리고 and 연산의 특징이 있다면,
위에서 보신 것처럼 하나라도 0이면, 0과 곱해지는 것이기 때문에 0이 무조건 출력이 되고,
비트 값이 1인 값과 특정한 x값이 있다고 가정하였을 때, 이 둘을 and 연산 시에 무조건 자기 자신인 x를 출력하게 됩니다.
그 이유는 비트 연산에서 1은 '참'을 뜻하므로, 그 결과는 무조건 자기 자신을 가리키게 되기 때문입니다.
이를 '항등 법칙'이라고 부릅니다.
1 - 2. 비트 or(|)
비트 or 연산은 피연산자들 중에 하나라도 1이 존재한다면 무조건 1을 출력합니다.
그래서 이 연산을 다른 말로 '논리합' 이라고도 합니다.
그래서 or 연산의 진리치 표를 써보면 다음과 같습니다.
논리식 | 결과 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
이렇게 작성을 할 수 있습니다.
그리고 여기에 사용이 된 법칙은 0과 어떤 수 x가 or 연산이 이루어지면 자기 자신인 x가 나오고,
어떤 수 x에 1이 더해지면 1이 나옵니다.
그 이유는 1은 디지털 공학적으로 설명을 했을 때, high값을 갖게 됩니다.
다시 말하면 최댓값을 갖는다는 뜻이 됩니다.
그래서 이 값과 합하면 무조건 최댓값이 될 수밖에 없다는 결론이 나옵니다.
그리고 이 법칙 역시 '항등 법칙'입니다.
1 - 3. 비트 xor(^)
xor 연산은 배타적 or 연산, 그리고 이를 회로에서 적용을 하게 되면 반 일치 회로라고 말하게 됩니다.
그 이유는 피연산자의 값이 같으면 0을 출력하고, 값이 다르면 1을 출력하기 때문입니다.
그래서 최대와 최저일 때는 무조건 0, 그 이외의 값이라면 1을 출력하는 시스템이기 때문에 그렇게 이름이 붙었습니다.
그럼 진리치 표는 어떻게 작성이 되었는지 한번 봅시다.
논리식 | 결과 |
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
그리고 이는 프로그래밍 언어에서는 조금 독특한 특징을 가지고 있는데요,
1을 어떤 수 x와 xor 연산을 할 시에 x의 값이 반전이 되면서 not이 적용이 된 x가 나옵니다.
그 이유는 두 개의 값이 같을 때는 0을 반환하고, 두 개의 값이 다를 때는 1을 반환하는 xor 연산의 특성상 값이 같지 않다면 반전된 수를, 그걸 다시 한 번 더 입력하여 값을 같게 만든다면 다시 원래의 수를 반환하게 되기 때문입니다.
그래서 이를 가지고서 암호화와 복호화를 하곤 합니다.
1 - 4. 비트 not(~)
not 연산은 결과가 반전되어 나오는 연산입니다.
예를 들어 비트 값이 0이면 1, 1이면 0을 반환합니다.
바로 진리치 표를 통해 보도록 하겠습니다.
논리식 | 결과 |
~ 0 | 1 |
~ 1 | 0 |
이런 식으로 부정을 의미하는 not 연산이 이루어지면 이렇게 결과가 나올 수 있습니다.
1 - 5. 비트 이동 연산(<<, >>)
비트 이동 연산은 이동을 하고 싶은 수를 지정했을 시에 그 수만큼 옮기게 하는 연산자입니다.
예를 들어 1 >> 1이라는 연산자가 있다면 오른쪽으로 한 칸만큼 비트를 이동시킵니다.
그리고 비트를 이동시킨다는 것은 다른 말로 승수를 높이거나 줄이는 것과 같습니다.
그 이유는 비트의 자릿수가 옮겨지는 것이기 때문에 승수에도 영향을 주기 때문입니다.
그래서 왼쪽으로 가면 승수가 증가하고, 오른쪽으로 가면 승수가 감소합니다.
그럼 이제 이 연산자들을 이용했을 때 어떤 식으로 나오는지 보기 위한 예제를 한 번 작성을 해보겠습니다.
#include <stdio.h>
int main()
{
printf("AND : %08X\n", 0x9 & 0xA);
printf("OR : %08X\n", 0x9 | 0xA);
printf("XOR : %08X\n", 0x9 ^ 0xA);
printf("NOT : %08X\n", ~0x9);
printf("<< : %08X\n", 0x4 << 1);
printf(">> : %08X\n", 0x4 >> 1);
return 0;
}
이렇게 각각 어떻게 연산이 이루어지는지 한 번 보기 위해서 작성을 해봤습니다.
그럼 결과 화면은 어떻게 나오는지 한 번 봅시다.
AND : 00000008
OR : 0000000B
XOR : 00000003
NOT : FFFFFFF6
<< : 00000008
>> : 00000002
이렇게 결과들이 잘 나온 것을 볼 수가 있습니다.
이 예제는 우리가 비트 수를 알기 위해서 16진수를 이용하여 작성을 한 예제입니다.
이래야 우리가 비트의 형태를 제대로 알 수 있기 때문입니다.
여기까지 c언어 비트 연산자에 대하여 알아보는 시간을 가져보았습니다.
다음 포스팅에서는 c언어 형 변환(캐스팅) 하는 방법에 대하여 알아보도록 하겠습니다.
긴 글 읽어주신 독자분들께 진심으로 감사드립니다 ~
'c언어' 카테고리의 다른 글
c언어 연산자의 우선순위와 결합 규칙 알아보기 (0) | 2022.12.02 |
---|---|
c언어 형 변환(캐스팅)하기 (2) | 2022.12.02 |
c언어 콤마 연산자에 대하여 알아보기 (0) | 2022.12.02 |
c언어 조건 연산자에 대하여 알아보기 (0) | 2022.12.02 |
c언어 논리 연산자에 대하여 알아보기 (0) | 2022.12.02 |
댓글