달나라 노트

C# : <<, >> (비트 시프트 연산자) 본문

C#/C#

C# : <<, >> (비트 시프트 연산자)

CosmosProject 2022. 4. 6. 19:22
728x90
반응형

 

 

 

<<, >> 연산자는 주어진 수를 2진수로 변경한 후 2진수를 일정 칸만큼 왼쪽 또는 오른쪽으로 이동한 값을 return합니다.

 

직접 코드를 보기 전에 이게 대체 무슨소리인지 예시를 통해 알아봅시다.

 

만약 100 >> 2 라고 적는다면 10진수 정수인 100을 2진법으로 나타낸 후 2진법으로 나타내진 숫자를 오른쪽으로 2칸씩 이동시키라는 의미입니다.

 

숫자 100을 2진법으로 나타내면 1100100 이것과 같습니다.

 

이동 전 -> 1100100

이동 후 -> 0011001

 

이동 전/후의 2진법은 위와 같습니다.

이동 전의 숫자를 오른쪽으로 2칸씩 이동시켰으니 가장 오른쪽에 있던 0 두개는 사라지게됩니다. (파란색 0 두개)

그리고 가장 왼쪽에는 2칸의 비어있는 자리가 생기게되니 이 비어있는 자리는 0으로 채웁니다. (보라색 0 두개)

이동 후 만들어진 숫자는 0011001인데 여기서 맨 앞에 있는 2개의 0은 의미가 없습니다. 마치 9와 09가 같은 것 처럼요.

따라서 결국 이동 후 숫자는 11001이 됩니다.

11001을 다시 10진법으로 바꾸면 25라는 정수가 됩니다.

 

즉, 100 >> 2라는 연산의 결과는 25가 됩니다.

 

 

위 과정을 그대로 코드로 작성한 것이 바로 아래 코드입니다.

 

using System;

class MyProgram
{
    public static void Main()
    {
        int test = 100;
        String test_2 = Convert.ToString(test, 2);
        Console.WriteLine(test.ToString() + " -> " + test_2);

        int test_shifted = test >> 2;
        String test_shifted_2 = Convert.ToString(test_shifted, 2);
        Console.WriteLine(test_shifted.ToString() + " -> " + test_shifted_2);
    }
}


-- Result
100 -> 1100100
25 -> 11001

 

위 코드를 보면 >> 시프트를 적용하기 전 숫자는 100인데 적용 후 숫자는 25입니다.

>> 시프트 연산을 적용시키면 이진수의 숫자들이 오른쪽으로 이동되며 이진수의 자리수가 적어집니다.

따라서 >> 시프트 연산의 결과는 이전 숫자보다 더 작은 숫자가 return됩니다.

 

 

 

 

 

 

 

 

이제 반대의 연산자인 <<를 봅시다.

 

만약 100 << 2 라고 적는다면 10진수 정수인 100을 2진법으로 나타낸 후 2진법으로 나타내진 숫자를 왼쪽으로 2칸씩 이동시키라는 의미입니다.

 

숫자 100을 2진법으로 나타내면 1100100 이것과 같습니다.

 

이동 전 ->    1100100

이동 후 -> 110010000

 

이동 전/후의 2진법은 위와 같습니다.

이동 전의 숫자를 왼쪽으로 2칸씩 이동시켰으니 오른쪽에 빈 공간이 생기고 따라서 빈 공간에 0이 채워집니다. (보라색 0 두개)

이동 후 만들어진 숫자는 110010000인데 이것을 다시 10진법으로 바꾸면 400이라는 정수가 됩니다.

 

즉, 100 << 2라는 연산의 결과는 400이 됩니다.

 

 

이것을 그대로 코드로 작성한 것이 바로 다음 코드입니다.

 

using System;

class MyProgram
{
    public static void Main()
    {
        int test = 100;
        String test_2 = Convert.ToString(test, 2);
        Console.WriteLine(test.ToString() + " -> " + test_2);

        int test_shifted = test << 2;
        String test_shifted_2 = Convert.ToString(test_shifted, 2);
        Console.WriteLine(test_shifted.ToString() + " -> " + test_shifted_2);
    }
}


-- Result
100 -> 1100100
400 -> 110010000

 

위 코드를 보면 << 시프트를 적용하기 전 숫자는 100인데 적용 후 숫자는 400입니다.

<< 시프트 연산을 적용시키면 이진수의 숫자들이 왼쪽으로 이동되며 이진수의 자리수가 많아집니다.

따라서 << 시프트 연산의 결과는 이전 숫자보다 더 큰 숫자가 return됩니다.

 

 

 

 

 

 

 

 

<<, >> 연산자도 사칙연산과 동일한 취급을 받습니다.

 

따라서 저희가 a + b의 결과를 a에 대입하라는 식을 a = a + b 또는 a += b 라고 씁니다.

<<, >>도 마찬가지입니다.

 

a = a << ba <<= b 와 동일한 식입니다.

a = a >> ba >>= b 와 동일한 식입니다.

 

using System;

class MyProgram
{
    public static void Main()
    {
        int test = 100;
        test >>= 2;
        Console.WriteLine(test);

        int test2 = 100;
        test2 <<= 2;
        Console.WriteLine(test2);
    }
}


-- Result
25
400

위에서 봤던 예시를 <<=, >>= 연산자를 이용한 결과입니다.

 

 

 

 

 

 

728x90
반응형
Comments