비트연산자, define

Yama·2023년 12월 1일
0

어소트락 수업

목록 보기
4/55

비트 연산자

  • 종류 :
    1. &(곱)
    2. |(합)
    3. ~(반전)
    4. ~(xor)
  • 비트단위로 연산을 진행한다.

&(곱)

  • 비교하는 비트 둘다 1일 경우에만 1인 비트가 들어온다.
    • 1010 & 1000 == 1000
  • 비트 단위로 And 연산 진행

|(합)

  • 비교하는 비트가 둘중 하나라도 1일 경우에만 1인 비트가 들어온다.
    • 1010 | 1000 == 1010
  • 비트 단위로 Or 연산 진행

~(반전)

  • 모든 비트를 0은 1로, 1은 0으로 반전시킨다.
// 1
char c = 0; 
c = ~c // -1 

// 2
unsigned char c = 0; 
c= ~ c // 255

^(xor)

  • 비교하는 비트가 같으면 0, 다르면 1
i = 10 ^ 8; // 1010 ^ 1000 == 0010  // 2 

비트 연산자를 쓰는 이유?

  • 게임에서 그 상태값같은것들을 저장할떄 자료형에 최소단위인 1 byte에 저장하게된다면 공간을 많이 차지하게된다.
  • 그리고 유지보수도 힘들당.
void GetPlayerStatus(bool status1, bool status2, bool status3, bool status4, bool status5)
{

}
int main(void)
{

	GetPlayerStatus(true, false, true, false, false);
}
  • bool자료형을 쓰면 상태변수를 상태당 bool형을 다써야함.(불편)

비트 연산자 사용처

  • 캐럭터의 능력치, 디버프, 상태 같은것들을 관리할떄 사용한다.
  • 우리가 다를쓰있는 데이터의 최소 단위는 1바이트다 그렇지만 비트 연산자를 사용하면 바이트당 8개의 상태를 저장가능하다.
  • 비트단위로 참 거짓을 사용해서 사용가능.

비트 연산자로 상태값을 표현하기.

unsigned int status = 0;

status |= 1;
status |= 2;
  • 특정 비트칸에 넣고 싶다면 그 특정칸에 대응하는 2의 배수를 or(합)하면 된다.
  • 2의 승수(각 비트 자리를 나타냄) 를 상태에 합치기
  • 각 자리를 나타내는 비트값을 define 전처리기로 작성해둠

#define

  • 변수를 특정 숫자로 취환해준다.
#define HUNGRY 1

int main()
{

	int iStatus = HUNGRY;
	return 0;
}
  • 저위의 코드를 HNUGRY를 전처기리 하였디.

실제 컴파일러가 컴파일 할때

#define HUNGRY 1

int main()
{

	int iStatus = 1;
	return 0;
}
  • 이렇게 HUNGRY 가 1로 바꿔거 컴파일 함.

define 전처리기는 16진수로 표현하기.

#define BLEED	1 
#define SLOW	2
#define STURN	4
#define SHOKR	8
#define BURN	16
#define ICE		32
#define ATT_UP	64
#define DEF_UP	128
#define DEX_UP	256
  • 그냥 숫자(나중가면 너무 커짐)
#define BLEED	0x1 
#define SLOW	0x2 
#define STURN	0x4 
#define SHOKR	0x8 
#define BURN	0x10 
#define ICE		0x20 
#define ATT_UP	0x40 
#define DEF_UP	0x80 
#define DEX_UP	0x100
  • 16진수로 간편하게 표현함.

define 많이 쓰는건 묶어서도 사용가능

#define BLEED	0x1 
#define BURN	0x10 
#define CLASS_DEBUF (BLEED | BURN) // 컴파일할때는 (16 | 1) 바뀜.

상태 추가.

// 전처리기 생략.
		status |= BLEED;
		status |= BURN;
		status |= SLOW;
  • 비트 합연산으로 상태를 추가 할수 있다.

상태 확인

		if (status & BURN) // 
		{
			printf("BURN 상태를 가지고 있다.\n");
		}
  • &(곱) 연산을 사용.
  • if( status &= BURN)
    • 스테이터스 자체값이 바꿔어서 대입하면 상태확인을 못한다.

상태 제거

		status = status & ~BURN; // status &= ~Burn;
  1. 제거하고싶은 상태를 반전시킨다.
  2. 원래 가지고있던 상태에 논리곱해서 대입한다.

강의 코드

#include <stdio.h>
#include <windows.h>

// 전처리기
#define BLEED  0x1
#define SLOW   0x2
#define STURN  0x4
#define SHORK  0x8
#define BURN   0x10 	
#define ICE    0x20
#define ATT_UP 0x40
#define DEF_UP 0x80
#define DEX_UP 0x100
#define DEX_UP 0x200
#define DEX_UP 0x400
#define DEX_UP 0x800
#define DEX_UP 0x1000
#define DEX_UP 0x2000
#define DEX_UP 0x4000
#define DEX_UP 0x8000

#define CLASS_DEBUF (BLEED | BURN)

int main(void)
{
	{
		int i = 10 & 8;
		i = 10 | 8;

		unsigned char c = 0;
		c = ~c;
        
		i = 10 ^ 8;

		unsigned int status = 0;

		// 1, 2, 4, 8, 32, 64



		status |= BLEED;
		status |= BURN;
		status |= SLOW;
		status |= CLASS_DEBUF;

		if (status & BURN)
		{
			printf("BURN 상태를 가지고 있다.\n");
		}

		status &= ~BURN;

		if (status & BURN)
		{
			printf("BURN 상태를 가지고 있다.\n");
		}
	}

	return 0;
}

1차 23.12.01
2차 23.12.05
3차 23.12.06
4차 23.12.11
5차 23.12.17
6차 23.12.24
7차 24.01.01
8차 24.01.22

0개의 댓글