본문 바로가기
Development/C#

[내일배움캠프 8일차 TIL] 비트 연산자, 시프트 연산, 단축 평가, 비트 플래그, 2진법

by 식냥 2024. 4. 24.
728x90

 

 [ 연산자 ]

산술 연산자

+, -, *, /, %

간단히 말해 사칙연산을 하는 연산자이다. /, %는 자료형에 따라 쓰임새가 다른데, int에서 /는 소수점 없이 몫이 나오고 %는 나머지 값이 나온다.

정수형끼리 연산을 할 때 결과값을 소수점을 포함한 실수형으로 나오게 하고 싶다면, 둘 중 하나는 실수형으로 바꿔주어야 한다.

 

할당 연산자

+=, -=, *=, /=, %=

변수에 값을 할당함과 동시에 연산을 하는 연산자이다.

 

단항 연산자

x++: 변수값 사용 후 1을 더해줌

x- -: 변수값 사용 1을 빼줌

++x: 변수값 사용 1을 더해줌

- -x: 변수값 사용 1을 빼줌

 

비교 연산자

==, !=, >, <, >=, <=

두 값이 동일한지 비교하거나, 크기를 비교한다.

 

논리 연산자

  • &&: 그리고(AND)

x × y

*참은 1, 거짓은 0

위의 수식에서 둘 중 하나라도 0이면 0이기 때문에 둘 다 참이어야 참이다.

&&거짓거짓

 

  • ||: 또는(OR)

x + y

위의 수식에서 둘 중 하나라도 참이면 1 이상이 되기 때문에 참이다.

 

 

  • !: 부정(NOT)

부정, not을 의미한다. b = !b는 반대값을 대입하는 것으로 값을 뒤집어준다.

0 → 1, 1 → 0

 

※ b != b는 서로 다른지 비교하는 것이다.

if문의 조건이 !b라면 !b true여야 하므로 b false여야 if문 실행된다. !b b==false와 같다.

 

  • ^: 배타적(XOR)

둘 중 하나만 참일 때 참이다. 둘 다 참이거나 거짓이면 거짓이다.

 

[ 비트 연산자 ]

  • &: 그리고(AND)

비트 단위로 두 비트를 곱하는 것이다. 따라서 두 비트 모두 1이어야 1이 된다.

 

  • |: 또는(OR)

비트 단위로 두 비트를 더하는 것이다. 따라서 둘 중 하나만 1이어도 1이 된다.

 

  • ~: 부정(NOT)

반대 값으로 반전시킨다. 1은 0으로, 0은 1로 바뀐다.

 

 

  • ^: 배타적(XOR)

두 비트가 다를 때 1이 된다. 두 비트가 같다면 0이 된다.

 

시프트 연산

  • <<: 왼쪽 시프트(Left Shift)

지정된 비트 수만큼 왼쪽으로 이동시키고, 오른쪽은 0으로 채운다.

숫자가 2개이기 때문에 2를 곱하면 왼쪽으로 한 칸씩 이동한다.

위 사진을 예시로 들어보자. 5 << 1에서 1은 2의 개수이다. 왼쪽 방향은 곱셈이므로 5×2=10이 나온다.

 

  • >>: 오른쪽 시프트(Right Shift)

지정된 비트 수만큼 오른쪽으로 이동시키고, 왼쪽은 0으로 채운다.

숫자가 2개이기 때문에 2를 나누면 오른쪽으로 한 칸씩 이동한다.

5 >> 1에서 오른쪽 방향은 나누기이므로 5×÷2=2가 나온다. 여기서 나온 값인 2는 몫이 된다.

 

단축 평가

int a = 10;
int b = 5;

//&& 연산자
if (a < 5 && ++b < 10)
{
    Console.WriteLine("참입니다.");
}
Console.WriteLine(b);	//5

//|| 연산자
if (a > 5 || ++b < 10)
{
    Console.WriteLine("참입니다.");
}
Console.WriteLine(b);	//5

&&는 앞에 것이 거짓이면 뒤에는 계산이 안 되고, ||는 앞에 것이 참이면 뒤에는 계산이 안 된다. 따라서 ++b 계산이 실행되지 않아 출력했을 때 값이 6이 아니라 5가 나온다.

 

하지만 비트 연산자는 뒤에 것까지 다 연산하기 때문에, 단축 평가가 일어났을 때 뒤의 조건식을 실행시키기 위해 따로 코드를 더 작성할 필요가 없다.

 

비트 플래그

비트 플래그는 각 비트를 ON(1), OFF(0)로 표시해서 데이터의 특정 상태나 옵션을 효율적으로 나타내는 기법이다. 각 비트 위치가 특정 상태나 설정을 나타내며, 이러한 비트들을 조합하여 다양한 설정과 상태를 한 번에 처리할 수 있다.

 

버프 창을 예시로 들어보자.

숫자 9라는 정보를 받았다. 9를 이진수로 표현하면 1001이다. 그러면 첫 번째 비트와 네 번째 비트가 활성화된 것이다. 따라서 캐릭터는 현재 크리티컬 확률 2배와 경험치 200% 버프를 받고 있는 것이다.

숫자 100이라는 정보를 받을 때는 이진수로 표현하면 1100100이다. 따라서 세 번째, 여섯 번째, 일곱 번째 비트가 활성화됐다. 현재 캐릭터는 재화 300%, 자동 회복, 이동속도 증가 버프를 받고 있다.

 

 

비트 연산자 장점

비트 연산자를 사용하면 작은 메모리 공간에 많은 정보를 담을 수 있어서 메모리를 아낄 수 있고, 처리 속도가 빠르다. 또한 불리언과 조건문을 이용한 복잡한 로직을 단순화할 수 있어 관리가 편하고, 정보를 판단하는 데 효율적이다. 또한 단순 숫자로 정보가 오가기 때문에 정보 추상화가 이루어져서 보안이 강화된다.

 

[ 2진법 ]

우리가 평소에 사용하는 수 체계는 10진법이다. 한 자릿수 위로 올라갈 때 10배가 되므로 10진법이라고 부른다. 예를 들어 1에서 한 자릿수가 올라가면 10이고, 한 자릿수 위로 올라가기까지 수가 10개이므로 1×10이 됐다.

 

2진수는 숫자가 0과 1로 2개 밖에 없다. 그래서 수를 2번 세면 자릿수가 올라간다. 즉 한 자릿수마다 2의 n승이 된다.

8자리 1바이트가 되고, 0b101, 0b1010처럼 맨 앞의 0b는 2진수라는 표시이다.

 

2진수는 수를 2로 나눴을 때 나온 나머지를 역순으로 조합한 수이다.

10을 예시로 들어보자.

10 ÷ 2 = 5, 나머지 0

5 ÷ 2 = 2, 나머지 1

2 ÷ 2 = 1, 나머지 0

맨 마지막의 몫과 다른 나머지를 역순으로 조합해서 1010이 나온다.

 

[ 회고 ]

2진법은 예전에 한 번 들어보고 이해하기를 포기했었는데, 이번에 튜터님의 강의와 다른 수강생 분들의 말을 통해 구조를 이해하게 됐다. 그리고 게임에서 2진수가 버프 같은 on, off 기능에서 사용할 수 있다는 것을 알고 확실하게 개념을 잡고 가는 것이 중요하다고 생각됐다. 아직은 비트 개념이 헷갈리지만, 계속해서 접하고 사용하다보면 익숙해지지 않을까하는 생각이 든다.

728x90
반응형