C#문법

[C#문법] Part5-5 연산자:비트연산자

BlackWolfDev 2023. 1. 24. 22:54

[ 개념 ]

비트연산자는 비트단위로 논리연산을 할 때 사용하는 연산자이다.

비트 단위로 왼쪽이나 오른쪽으로 비트를 이동하는 등의 방식으로 사용된다.


[ 비트연산자의 종류 ]

 


  • &연산자

&연산자(AND연산자)

&연산자는 두비트가 모두 1일때만 1을 반환하고 아닌 경우에는 0을 반환한다.


  • |연산자

두 비트중 하나라도 1이면 1을 반환하고 두 비트가 모두 0일때 0을 반환한다.

  • ^연산자

^연산자(XOR연산자)

두 비트가 같으면 0 다르면 1을 반환한다.


  • ~연산자

~연산자(NOT연산자)

비트를 반전시키는 연산자로써 10으로 0 1로 반환환다.

프로그래밍할때 ~연산자를 사용하면 1의보수의 결과값을 반환한다.

1의 보수는 비트를 반전시키고 맨 뒤의 비트에 1을 더해준다.


  • << 연산자

<<연산자

<<는 비트를 왼쪽으로 이동시키는 연산자로써 오른쪽에 새로 생기는 비트는 0으로 채워준다.

위의 그림은 << 옆에 2를 붙였는데 2는 비트를 2칸 옮겨주었다는 의미이다.

여기서 MSBMost Significant Bit의 약자로 어떠한 데이터형의 최상위 비트를 의미하며

LSBLeast Significant Bit의 약자로 어떠한 데이터형의 최하위 비트를 의미한다.

위의 예제에서는 8bit 데이터형으로 가정하여 MSB를 넘은 비트는 삭제된다.


  • >>연산자

양수에 >>연산자를 적용한 경우
음수에 >>연산자를 적용한 경우

>>는 비트를 오른쪽으로 이동시키는 연산자로써 왼쪽에 새로 생기는 비트는 원래 비트가 양수일 경우 0으로 채워지고 음수일 경우 1로 채워진다.

이는 컴퓨터에서 비트의 부호를 표현할때 MSB의 비트가 0일 경우 양수, 1일 경우 음수로 표현하기로 정하였다.

그래서 비트이동 연산을 할 때 부호가 바뀌는걸 방지하기 위해 양수는 0으로 음수는 1로 채워진다.


[ 결과 ]

static void Main(string[] args)
{
    byte num1 = 0b_0000_1111; //15
    byte num2 = 0b_0010_1011; //43

    byte num3 = 0b_0000_1000; //8

    Console.WriteLine("num1 & num2 결과: " + (num1 & num2)); //11
    Console.WriteLine("num1 | num2 결과: " + (num1 | num2)); //47
    Console.WriteLine("num1 ^ num2 결과: " + (num1 ^ num2)); //36
    Console.WriteLine();

    Console.WriteLine("~num1 결과1: " + Convert.ToString(~num1, toBase: 2));
    Console.WriteLine("~num1 결과2: " + ~num1); //-16
    Console.WriteLine();

    Console.WriteLine("num3 <<1 결과: " + (num3 << 1)); //16
    Console.WriteLine("num3 <<2 결과: " + (num3 << 2)); //32
    Console.WriteLine();

    Console.WriteLine("num3 >>1 결과: " + (num3 >> 1)); //4
    Console.WriteLine("num3 >>2 결과: " + (num3 >> 2)); //2
    Console.WriteLine();
}

콘솔결과값

0000_1111(15) & 0010_1011(43) = 0000_1011(11)이 된다.

0000_1111(15) | 0010_1011(43) = 0010_1111(47)이 된다.

0000_1111(15) ^ 0010_1011(43) = 0010_0100(36)이 된다.

 

0000_1111~ 연산자를 사용하면 비트가 반전되어 1111_000이 된다.

(모든 비트가 다 출력되어 값은 다르게 나오는데 반전되는 사실만 참고하면 된다.)

이를 출력하면 -16이 되는데 ~연산자를 사용하면 비트를 반전시키고 이에 +1을 하는데

15를 반전시켜서 -15로 바꾸고 비트를 1더해주는데 음수이므로 -1되어 -16이 된다.

 

0000_1000(8)<<1 해주면 비트가 왼쪽으로 한 칸 움직여 0001_0000(16)이 된다.

0000_1000(8) <<2 해주면 비트가 왼쪽으로 두 칸 움직여 0010_0000(32)이 된다.

1칸씩 왼쪽으로 밀수록 2의 배수로 증가함을 알 수 있다.

0000_1000(8)>>1 해주면 비트가 오른쪽으로 한 칸 움직여 0000_0100(4)이 된다.

0000_1000(8)>>2 해주면 비트가 오른쪽으로 두 칸 움직여 0000_0010(2)이 된다.

1칸씩 오른쪽으로 밀수록 2씩 나누어짐을 알 수 있다.

728x90
반응형