비트연산 대해 배운것 + C# enum flags



1
2
3
4
5
6
7
8
9
10
11
12
13
14
[System.Flags]
public enum Attachable
{
 
    None = 0
    Muzzle = 1 << 0
    Scope = 1 << 1
    HandGuard = 1 << 2
    Magazine = 1 << 3
    Stock = 1 << 4
Everything = ~0,
 
 
    HandGun =  Muzzle | Scope | Magazine
}
cs
순서대로 int값이 0, 1, 2, 4 ,8, 16, 31, 11 이다 


ray쓸때 필요한 지식

비트 연산자

이항 연산자

& = 'AND' 예) A와 B 모두가 true면 true
| = 'OR' 예) A와 B 중 하나라도 true면 true.
^ = 'XOR' 예) A ^ B = A와 B가 서로 다른 값일 때 true

단항 연산자

~ = 값을 뒤집는 연산자.
! = 0인 값을 1로, 0이 아닌 모든 값을 0으로 만들어준다.


Shift 연산자

<< = 비트값을 왼쪽으로 이동시킨다.
>> = 비트값을 오른쪽으로 이동시킨다.

예) 
1 << 2 = 4.
1의 비트값을 0001.
이것을 왼쪽으로 2번 이동하면 0100, 즉 4가 된다.
비워진 값은 0으로 변환한다.

8 >> 2 = 2.
8의 비트값은 1000.
오른쪽으로 2번 이동하면 0010, 즉 2가 된다.
비워진 값이 양수면 0, 음수면 1로 변환한다.

활용하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    void Test()
    {
        Attachable temp = Attachable.None; // 모든 값 빼기
        temp = Attachable.Everything; // 모든 값 넣기 
 
        // 연산자
        temp &= ~Attachable.HandGun; // 기존 값 빼기 => Handguard,Stock
        temp |= Attachable.Scope; // 기존 값 넣기 => Handguard,Stock,Scope
        temp ^= Attachable.HandGun; // 값 반전 => Handguard,Stock
        temp = Attachable.Everything ^ Attachable.Muzzle ^ Attachable.Scope; // 값 제외 => Handguard,Stock,Magazine
 
        // 값 확인
        Attachable withoutScope = Attachable.Everything ^ Attachable.Scope;
        if ((temp & withoutScope) != 0) ; // temp에 withoutScope가 있으면 True
        if ((temp & withoutScope) == 0) ; // temp에 withoutScope가 없으면 True
        if (temp.HasFlag(withoutScope)) ; // net 4.0 이상, temp에 withoutScope가 있으면 True
    }
cs

댓글

이 블로그의 인기 게시물

2D 총게임 반동 표시

Simple Stupid Funnel 후기