본문 바로가기
Major/#C언어 (C Programming)

C언어의 연산자 (C Language Operators)

by Bright_Between 2023. 4. 27.
반응형

C 언어는 비트 연산자(bitwise operator)라고 불리는 다양한 비트 조작 연산자들을 제공합니다. 비트 연산자는 비트(bit) 단위로 데이터를 조작하기 때문에, 이진(binary) 데이터를 다룰 때 매우 유용합니다. 이 글에서는 C 언어에서 제공하는 비트 연산자들의 종류와 쓰임에 대해서 설명하겠습니다.

 


### 1. 비트 AND(&)

비트 AND 연산자(&)는 두 개의 비트를 비교하여, 두 비트가 모두 1인 경우에만 결과가 1이 되는 연산자입니다. 예를 들어, 0b1101과 0b1011의 비트 AND 연산은 다음과 같습니다.

```
0b1101 & 0b1011 = 0b1001
```

 


### 2. 비트 OR(|)

비트 OR 연산자(|)는 두 개의 비트를 비교하여, 두 비트 중 하나라도 1인 경우에 결과가 1이 되는 연산자입니다. 예를 들어, 0b1101과 0b1011의 비트 OR 연산은 다음과 같습니다.

```
0b1101 | 0b1011 = 0b1111
```

 


### 3. 비트 XOR(^)

비트 XOR 연산자(^)는 두 개의 비트를 비교하여, 두 비트가 서로 다른 경우에 결과가 1이 되는 연산자입니다. 예를 들어, 0b1101과 0b1011의 비트 XOR 연산은 다음과 같습니다.

```
0b1101 ^ 0b1011 = 0b0110
```

 


### 4. 비트 NOT(~)

비트 NOT 연산자(~)는 단항 연산자로, 비트를 반전시키는 연산자입니다. 즉, 0은 1로, 1은 0으로 바꾸는 것입니다. 예를 들어, 0b1101의 비트 NOT 연산은 다음과 같습니다.

```
~0b1101 = 0b0010
```

 


### 5. 왼쪽 시프트(<<)

왼쪽 시프트 연산자(<<)는 비트를 왼쪽으로 이동시키는 연산자입니다. 왼쪽 시프트 연산은 비트의 값을 2배씩 증가시키는 효과가 있습니다. 예를 들어, 0b0011을 왼쪽으로 2번 시프트한 결과는 다음과 같습니다.

```
0b0011 << 2 = 0b1100
```

 


### 6. 오른쪽 시프트(>>)

오른쪽 시프트 연산자(>>)는 비트를 오른쪽으로 이동시키는 연산자입니다. 오른쪽 시프트 연산은 비트의 값을 2배씩 감소시키는 효과가 있습니다. 하지만, 부호 있는 정수형 변수에 대해서는 부호를 유지하기 위해 오른쪽 시프트 연산자가 부호 확장(sign extension)을 수행할 수 있습니다. 이 경우, 부호 비트(sign bit)가 1인 경우에는 1로 채워지고, 0인 경우에는 0으로 채워집니다.

예를 들어, 0b1011을 오른쪽으로 2번 시프트한 결과는 다음과 같습니다.

```
0b1011 >> 2 = 0b0010
```

하지만, -0b1011(부호 있는 4비트 이진수)을 오른쪽으로 2번 시프트한 결과는 부호 비트를 유지하기 위해 1로 채워집니다.

```
-0b1011 >> 2 = -0b0011
```

 

 

### 7. 비트 마스크

비트 마스크(mask)는 특정 비트의 값을 덮어쓰거나 유지하기 위해 사용하는 기술입니다. 비트 마스크를 사용하면, 비트 연산자를 이용하여 특정 비트의 값을 추출하거나, 특정 비트를 0 또는 1로 설정할 수 있습니다.

예를 들어, 0b1101의 하위 2비트를 추출하기 위해서는 다음과 같은 마스크를 사용할 수 있습니다.

```
0b1101 & 0b0011 = 0b0001
```

이 경우, 0b0011은 하위 2비트가 1인 비트 마스크입니다. 마스크를 이용하면, 특정 비트를 0 또는 1로 설정할 수도 있습니다. 예를 들어, 0b1101에서 상위 2비트를 0으로 만들기 위해서는 다음과 같은 마스크를 사용할 수 있습니다.

```
0b1101 & 0b0011 = 0b0001
```

이 경우, 0b1101과 0b1100의 비트 AND 연산을 수행하면, 상위 2비트가 0으로 설정됩니다.

 


### 8. 비트 연산자의 활용

비트 연산자는 이진 데이터를 다루는 데 매우 유용합니다. 예를 들어, 비트 마스크를 사용하면, 8비트 이진 데이터에서 각 비트가 어떤 의미를 가지는지 알 수 있습니다. 이렇게 알아낸 정보를 이용하여 데이터를 분석하거나 처리할 수 있습니다.

또한, 비트 연산자를 이용하여 효율적인 코드를 작성할 수도 있습니다. 예를 들어, 비트 마스크를 이용하여 특정 비트를 추출하는 코드는 일반적인 비트 조작 연산보다 빠릅니다. 또한, 비트 연산자를 이용하여 플래그(flag) 변수를 사용할 수도 있습니다. 플래그 변수는 프로그램에서 특정 상태를 나타내는 데 사용되는 변수입니다. 예를 들어, 파일의 상태를 나타내는 플래그 변수는 다음과 같은 값을 가질 수 있습니다.

```
#define FILE_READ   0x01  // 00000001
#define FILE_WRITE  0x02  // 00000010
#define FILE_APPEND 0x04  // 00000100
```

위의 예에서, FILE_READ, FILE_WRITE, FILE_APPEND는 각각 1비트씩 사용되며, 이진수 상에서는 2의 제곱 형태로 표현됩니다. 이렇게 표현된 플래그 변수를 이용하여 파일의 상태를 나타내고, 비트 연산자를 이용하여 특정 플래그가 설정되어 있는지 확인하거나 설정할 수 있습니다.

 

 


### 9. 결론

비트 연산자를 이용하면 이진 데이터를 다루는 데 매우 편리하며, 비트 마스크를 이용하여 효율적인 코드를 작성할 수도 있습니다. 그러나, 비트 연산자를 남발하면 코드의 가독성이 떨어지고 디버깅이 어려워지기 때문에, 적절한 상황에서만 사용하는 것이 좋습니다.

반응형

댓글