Anna belly belly hard/C#

[C# 개념] 4.9 비트 연산자

bibiana 각선행 2023. 7. 10. 14:50
반응형

- 컴퓨터는 원래 0 과 1의 비트 데이터만 다루는 기계 인데, 지금까지의 데이터 형식을 보면 1바이트 크기의 형식이 가장 작습니다. 비트를 무려 8개나 담을 수 있는 크기의 데이터 형식.

- 지금 까지 본 데이터 형식의 크기도 모두 '바이트' 단위로 이루어져 있다.

- 바이트 단위가 대부분의 데이터를 다루기에 용이한 크기이긴하지만, 어쨋든 비트 수준에서 데이터를 가공해야 하는 경우가 생기는데, 비트 연산자는 이를 위한 연산자.

 

4.9.1 시프트 연산자

1) Shift Operator

- 비트를 왼쪽이나 오른쪽으로 이동시키는 연산

2) 왼쪽 시프트 연산

3) 오른쪽 시프트 연산

4) 음수에 대한 오른쪽 시프트 연산

5) 시프트 연산자의 사용법

- 시프트 연산자는 산술 연산자 처럼 피연산자 두개를 받는다.

- 왼쪽 피 연산자는 왼본데이터, 오른쪽 피 연산자는 옮길 비트의 수입니다.

6) 시프트 연산의 의미

- 240(0000 0000 1111 0000) 을 왼쪽으로 2비트 시프트한 결과는 960 (0000 0011 1100 0000)

- 오른쪽으로 2비트 시프트한 결과는 60

- 원본 데이터를 a , 옮긴 비트 수를 b 라고 할때,

왼쪽 시프트 연산을 하면 a x 2b ,

오른쪽 시프트 연산을 하면 a : 2b

- 이 점을 이용해서 시프트 연산은 고속의 곱셈과 나눗셈을 구현하는 데 사용하기도 하고,

- & 연산자, | 연산자와 함께 byte 처럼 작은 단위로 쪼개진 데이터를 다시 하나의 int 나 long 형식으로 재조립 하는 데 사용

 

using System;

namespace ShiftOperator
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Testing <<...");

            int a = 1;
            /* 1바이트(8비트)로 나타낼수 있는 수는 256가지 입니다.
               따라서 8자리의 16진수면 int 형식이 표현하는 모든수를 나타낼수 있습니다.
             */
            Console.WriteLine("a     :{0:D5} (0X{0:x8})", a);
            Console.WriteLine("a << 1:{0:D5} (0X{0:x8})", a << 1);
            Console.WriteLine("a << 2:{0:D5} (0X{0:x8})", a << 2);
            Console.WriteLine("a << 5:{0:D5} (0X{0:x8})", a << 5);
            Console.WriteLine("\nTesting >>...");

            int b = 255;
            Console.WriteLine("b     :{0:D5} (0X{0:x8})", b);
            Console.WriteLine("b >> 1:{0:D5} (0X{0:x8})", b >> 1);
            Console.WriteLine("b >> 2:{0:D5} (0X{0:x8})", b >> 2);
            Console.WriteLine("b >> 5:{0:D5} (0X{0:x8})", b >> 5);
            Console.WriteLine("\nTesting >>> 2...");

            int c = -255;
            Console.WriteLine("c     :{0:D5} (0X{0:x8})", c);
            Console.WriteLine("c >> 1:{0:D5} (0X{0:x8})", c >> 1);
            Console.WriteLine("c >> 2:{0:D5} (0X{0:x8})", c >> 2);
            Console.WriteLine("c >> 5:{0:D5} (0X{0:x8})", c >> 5);

        }
    }
}

 

 

4.9.2 비트 논리 연산자

- 논리 연산 : 참 또는 거짓의 진릿값을 피연산자로 하는 연산

- 비트 논리 연산 : 데이터의 각 비트에 대해 수행하는 논리 연산

- 비트 논리 연산자는 bool 형식 외에 정수 계열 형식의 피연산자에 대해서도 사용할 수 있다.

- 우리가 사용하는 데이터가 0 과 1로 이루어져 있다는 사실

-  int 형식 데이터는 4바이트,  즉 32개의 비트로 이루어짐

-  long 형식 데이터는 8바이트, 즉 64개의 비트로 이루어짐

- 비트 논리 연산은 이 비트 덩어리를 이루고 있는 각 비트에 대해 1 은 참, 0 은 거짓으로 해서 논리 연산을 하는 것

 

 

using System;

namespace BitwiseOperator
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int a = 9;
            int b = 10;

            Console.WriteLine($"{a} & {b} : {a&b}");
            Console.WriteLine($"{a} | {b} : {a | b}");
            Console.WriteLine($"{a} ^ {b} : {a ^ b}");

            int c = 255;
            Console.WriteLine("~{0}(0x{0:X8}) :{1}(0x{1:X8}) ", c,~c);
        }
    }
}

반응형