웹사이트 검색

Linux C 프로그래밍 자습서 13부 - 비트 연산자(기본)


이 페이지에서

  1. 결론

지금까지 이 진행 중인 C 프로그래밍 자습서 시리즈에서 산술, 논리, 관계 및 할당과 같은 여러 종류의 연산자에 대해 논의했습니다. 그러나 C 프로그래밍 언어에 필수적인 또 다른 종류의 연산자가 있습니다. 우리는 비트 연산자에 대해 이야기하고 있습니다.

이미 알고 계시겠지만 C 프로그램에서 사용하는 모든 변수는 메모리에 바이트 형식으로 저장됩니다. 또한 이러한 바이트는 각각 8비트로 나뉩니다. 비트는 1 또는 0일 수 있습니다. 예를 들어, a가 값이 1인 짧은 정수(2바이트를 차지함)인 경우 메모리 수준에서 a를 나타내는 방법은 다음과 같습니다.

00000000 00000001

마찬가지로 b가 3이면 메모리에 어떻게 표시되는지는 다음과 같습니다.

00000000 00000011

참고: 정수가 메모리에서 비트 형식으로 표현되는 방법에 대해 자세히 알아보려면 여기로 이동하세요.

여기에서 논의하려는 Bitwise 연산자는 이러한 비트에서 작동합니다. &로 표현되는 비트 AND 연산자부터 시작하겠습니다. 두 개의 동일한 길이의 이진 표현 을 취하고 해당 비트에서 논리적 AND 연산을 수행합니다.

논리 AND 연산에서 해당하는 두 비트가 모두 1일 때만 결과는 1입니다. 그렇지 않으면 결과는 0입니다. 따라서 다음을 수행하면:

a & b

a가 1이고 b가 3인 경우(이 자습서의 시작 부분에서 설명한 대로) 작업 결과는 다음과 같습니다.

00000000 00000001

a와 b의 비트 표현을 논리적으로 AND하면 맨 오른쪽 비트만 1로 남고 다른 모든 비트는 0이 되기 때문입니다.

이 작업에 대한 코드는 다음과 같습니다.

#include <stdio.h>

int main()
{
short a = 1;
short b = 3;
printf("a & b = %i", a&b);

return 0;
}

이 코드의 출력은 다음과 같습니다.

a & b = 1

&와 마찬가지로 다른 비트 연산자가 있습니다. 전체 목록은 다음과 같습니다.

&  - AND 
| - inclusive OR
^ - exclusive OR
<< - left shift
>> - right shift
~ - one's complement or NOT

OR 연산자(|)는 피연산자의 해당 비트에 대해 논리 포함 OR 연산을 수행합니다. 비트 중 하나라도 1이면 결과 비트도 1이고 그렇지 않으면 결과 비트는 0입니다. 배타적 OR(또는 XOR) 연산자는 꽤 잘 작동합니다. OR 연산자와 매우 유사하지만 두 비트가 모두 0 또는 1이면 결과 비트가 0입니다.

왼쪽 이동 연산자는 두 번째 피연산자가 지정한 횟수만큼 비트를 이동합니다. 예를 들어, 다음 줄은 비트가 왼쪽으로 세 번 이동되었는지 확인합니다.

a << 3

a가 값이 1인 짧은 정수인 경우 해당 비트 표현은 다음과 같습니다.

00000000 00000001

그러나 왼쪽 시프트 연산 후에 비트 표현은 다음과 같이 되었습니다.

00000000 00001000

따라서 모든 비트가 3번 이동하여 값이 1인 비트를 네 번째 위치로 가져오고 비어 있는 비트 위치를 0으로 채우는 것을 볼 수 있습니다. 따라서 이제 a의 십진수 값은 8이 됩니다.

같은 줄에서 오른쪽 이동 연산자(>>)는 비트를 오른쪽으로 이동합니다. 마지막으로, 이 목록의 유일한 단항 연산자인 1의 보수 또는 NOT 연산자는 피연산자의 모든 비트를 반전(또는 각 비트에서 논리 부정을 수행)합니다. 예를 들어, a가 1바이트 변수이고 메모리에서 다음과 같은 방식으로 표현되는 경우:

11111110

그러면 ~a가 다음과 같이 만들 것입니다.

00000001

비트 연산자는 char, short, int, long 변수(signed 및 unsigned 모두)에만 적용할 수 있습니다.

결론

비트 연산자의 기본 개념을 명확하게 할 수 있었으면 합니다. 물론 여기서 다루지 않은 비트 연산자의 실제 예뿐만 아니라 부호 있는 값에 시프트 연산자를 적용하는 것과 같은 몇 가지 시나리오가 있습니다. 그러나 그것들은 다가오는 튜토리얼에서 확실히 다룰 것입니다.