C#/문법 정리

C# - 비트 단위 연산자(bitwise operators)

Khadra 2024. 7. 2. 19:09

비트연산자 6가지 종류 (C,C++언어와 같다.)

연산자 의미
~ Bitwise Complement
& Bitwise AND
| Bitwise OR
^ Bitwise Exclusive OR(XOR)
<< Bitwise Left shift
>> Bitwise Right shift

정수형 변수(int, long, 등)와 bool형 변수에 대해 비트 수준에서 연산한다.

  • 예를 들어, 정수 14는 2진수로 표현한다면 1110, 정수 11은 2진수로 표현한다면 1011이다.
  • 즉, 정수는 32비트이지만, 8비트만을 표현하면 정수 14는 0000 1110, 정수 11은 0000 1011이다.

6가지 비트 연산 표에 대한 설명

비트 연산명 설명
비트 AND(&)
14 : 0000 1110
11 : 0000 1011
-----------------
& : 0000 1010
비트 OR(|)
14 : 0000 1110
11 : 0000 1011
-----------------
| : 0000 1111
비트 XOR(^)
14 : 0000 1110
11 : 0000 1011
-----------------
^ : 0000 0101
비트 NOT(~)
14 : 0000 1110
-----------------
~ : 1111 0001
왼쪽 두 비트 시프트
14 : 0000 1110
-----------------
<<2 : 0011 1000
오른쪽 한 비트 시프트
11 : 0000 1011
-----------------
>>1 : 0000 0101
  • 비트 AND, 비트 OR, 비트 XOR 는 피연산자가 2개인 이항연산자이다.

    • 각 비트별로 AND,OR,XOR 연산을 수행한다.
  • 비트 NOT 연산은 피연산자가 하나이며, 각 비트의 0과 1를 바꾸어 준다.

    • 위 표에서 0000 1110을 비트 NOT한 결과는 1111 0001인데, 맨 앞자리가 1이므로 음수로 해석되고, 음수는 2의 보수로 계산되므로 -15로 해석된다.
  • 왼쪽 시프트와 오른쪽 시프트 연산은 오른쪽에 몇 비트를 시프트 하는지 숫자로 표시한다.

    • 왼쪽 시프트는 한 비트를 시프트할 때마다 2를 곱하는 효과가 있다.
    • 오른쪽 시프트는 한 비트를 시프트할 때마다 2로 나누는 효과가 있다.

예제 코드

using System;
using static System.Console;//Console단어를 생략(코드길이줄어둠)
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // x = 14, y = 11,result를 정수형 변수로 선언한다.
            int x = 14, y = 11, result; 

            // x와 y의 비트 OR 연산을 하고 결과를 result에 할당한 후 출력한다.
            result = x | y; 
            WriteLine("{0} | {1} = {2}", x, y, result);

            // x와 y의 비트 AND 연산을 하고 결과를 result에 할당한 후 출력한다.
            result = x & y; 
            WriteLine("{0} & {1} = {2}", x, y, result);

            // x와 y의 비트 배타적 OR 연산을 하고 결과를 result에 할당한 후 출력한다.
            result = x ^ y; 
            WriteLine("{0} ^ {1} = {2}", x, y, result); 

            // x의 보수를 계산하여 결과를 result에 할당한 후 출력한다.
            result = ~x; 
            WriteLine("~{0} = {1}", x, result); // 0은 1로, 1은 0으로 바꾸어주는 1의 보수이다.


            //x를 왼쪽으로 2비트 시프트하고 결과를 출력한다. x에 4를 곱하는 결과이다.
            result = x << 2; 
            WriteLine("{0} << 2 = {1}", x, result);

            // y를 오른쪽으로 1비트 시프트하고 결과를 출력한다. y에 2를 나누는 결과이다.
            result = y >> 1; 
            WriteLine("{0} >> 1 = {1}", y, result);
        }
    }
}

결과

14 | 11 = 15
14 & 11 = 10
14 ^ 11 = 5
~14 = -15
14 << 2 = 56
11 >> 1 = 5