ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 팁: 플래그와 비트연산
    @ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2013. 4. 23. 23:06

    책에서 설명을 하길..

    게임에서는 bool형 변수를 여러개 만드는 대신 unsigned형 변수 하나에 여러플래그를 묶어 넣는 방법을 자주 사용한다고 한다.

    유무를 표시하는데는 0과 1을 나타내는 비트 하나면 충분하기때문에 4바이트 크기인 unsigned형 변수 하나에는 플래그 변수를 32개 모아 둘 수 있다는 것이다.

    놀랍네..!그리고 약..40억 종류를 표현한다고 한다??! 뭐야 이거...엄청나다!

    책에서는 플래그를 클래스로 만들면 아래와 같다고 소개해준다.

    class Flag{
    private:
    	unsigned char mFlags;
    public:
    	bool check(인수 미정);
    	void set(인수 미정);
    	void reset(인수 미정);
    };
    
    

    check 함수로 특정 플래그 상태를 조사하고 set함수로 특정 플래그를 온하며 reset함수로 특정 플래그를 오프로 한다고 한다.

    비트 연산의 종류와 방법은....C++항에 설명이 되어있으니...ㅋㅋ;

    나는 아래와 같이 작성해봤다..허접하게 그리..ㅋ

    enum mFlag{
    		FLAG_WALL=(1<<7), ⁄⁄128
    		FLAG_GOAL=(1<<6), ⁄⁄64
    		FLAG_MAN=(1<<2),
    	};
    
    class Flag{
    private:
    	unsigned char mFlags;
    public:
    	Flag(unsigned char num=0)
    	{
    		mFlags=num;
    	}
    	bool check(unsigned char f)
    	{
    		return mFlags&=f;
    	}
    	void set(unsigned char f)
    	{
    		mFlags=f;
    	}
    	void reset()
    	{
    		unsigned char temp;
    		temp=mFlags;
    		mFlags&=~temp;
    		if(mFlags==0)
    		{
    			cout << "0 이 되었음 "<< endl;
    		}
    		else
    			cout << "0이 안됨 " << endl;
    	}
    };
    
    int main()
    {
    	Flag f;
    	f.set(FLAG_GOAL | FLAG_MAN);
    	cout << f.check(FLAG_WALL) << endl;
    	f.reset();
    	getch();
    	return 0;
    }
    
    

    set함수로 온하고 싶은 비트를 설정하고 check함수를 이용하여 온이 되어있는지 확인하고..reset으로 다시 돌려놓는..

    그리고 책에서는 포인터, 참조에 대해 추가설명이 있지만..여기선 생략..ㅎㅎ;

     

     

Designed by Tistory.