본문 바로가기
c언어

c언어 비트 연산자에 대하여 알아보기

by 개발자 L 2022. 12. 2.
반응형

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언어 형 변환(캐스팅) 하는 방법에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다 ~

반응형

댓글