programing tip

플래그 열거 형이 일반적으로 16 진 값으로 정의되는 이유

itbloger 2020. 7. 21. 08:06
반응형

플래그 열거 형이 일반적으로 16 진 값으로 정의되는 이유


여러 번 16 진 값을 사용하는 플래그 열거 선언이 나타납니다. 예를 들면 다음과 같습니다.

[Flags]
public enum MyEnum
{
    None  = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4,
    Flag4 = 0x8,
    Flag5 = 0x10
}

열거 형을 선언하면 일반적으로 다음과 같이 선언합니다.

[Flags]
public enum MyEnum
{
    None  = 0,
    Flag1 = 1,
    Flag2 = 2,
    Flag3 = 4,
    Flag4 = 8,
    Flag5 = 16
}

일부 사람들이 왜 소수가 아닌 16 진수로 값을 쓰도록 선택했는지에 대한 이유나 근거가 있습니까? 내가 보는 방식으로 16 진수 값을 사용할 때 혼란스럽고 실수로 Flag5 = 0x16대신 쓰는 것이 더 쉽습니다 Flag5 = 0x10.


이론적 근거는 다를 수 있지만 16 진수는 다음과 같이 상기시켜줍니다. "좋아요, 우리는 더 이상 인간이 발명 한 기본 10의 세계에서 숫자를 다루지 않습니다. 우리는 기계 세계와 비트를 다루고 있습니다. 우리는 '그 규칙에 따라 연주 할 것입니다. " 16 진수는 데이터의 메모리 레이아웃이 중요한 상대적으로 낮은 수준의 주제를 다루지 않는 한 거의 사용되지 않습니다. 그것을 사용하면 그것이 현재 상황이라는 사실을 암시합니다.

또한 C #에 대해 잘 모르겠지만 C x << y에서는 유효한 컴파일 타임 상수 라는 것을 알고 있습니다. 비트 시프트를 사용하는 것이 가장 분명해 보입니다.

[Flags]
public enum MyEnum
{
    None  = 0,
    Flag1 = 1 << 0,
    Flag2 = 1 << 1,
    Flag3 = 1 << 2,
    Flag4 = 1 << 3,
    Flag5 = 1 << 4
}

이진 플래그 임을 쉽게 알 수 있습니다 .

None  = 0x0,  // == 00000
Flag1 = 0x1,  // == 00001
Flag2 = 0x2,  // == 00010
Flag3 = 0x4,  // == 00100
Flag4 = 0x8,  // == 01000
Flag5 = 0x10  // == 10000

하지만 진행은 그것도 명확하게 :

Flag6 = 0x20  // == 00100000
Flag7 = 0x40  // == 01000000
Flag8 = 0x80  // == 10000000

시퀀스가 항상 1,2,4,8이기 때문에 0을 추가하기 때문이라고 생각합니다
.

0x1 = 1 
0x2 = 2
0x4 = 4
0x8 = 8
0x10 = 16
0x20 = 32
0x40 = 64
0x80 = 128
0x100 = 256
0x200 = 512
0x400 = 1024
0x800 = 2048

1-2-4-8 시퀀스를 기억하는 한 2의 거듭 제곱을 기억하지 않고도 모든 후속 플래그를 만들 수 있습니다.


때문에 [Flags]열거 정말 있음을 의미 비트 필드 . 으로 [Flags]당신은 비트 AND (사용 &) 및 OR ( |플래그를 결합) 연산자를. 이와 같은 이진 값을 처리 할 때는 16 진 값을 사용하는 것이 거의 항상 더 분명합니다. 이것이 우리 가 처음에 16 진수사용하는 이유 입니다. 각 16 진 문자는 정확히 1 니블 (4 비트)에 해당합니다. 10 진수를 사용하면이 1 대 4 매핑이 적용되지 않습니다.


Because there is a mechanical, simple way to double a power-of-two in hex. In decimal, this is hard. It requires long multiplication in your head. In hex it is a simple change. You can carry this out all the way up to 1UL << 63 which you can't do in decimal.


Because it is easier to follow for humans where the bits are in the flag. Each hexadecimal digit can fit a 4 bit binary.

0x0 = 0000
0x1 = 0001
0x2 = 0010
0x3 = 0011

... and so on

0xF = 1111

Typically you want your flags to not overlap bits, the easiest way of doing and visualizing it is using hexadecimal values to declare your flags.

So, if you need flags with 16 bits you will use 4 digit hexadecimal values and that way you can avoid erroneous values:

0x0001 //= 1 = 000000000000 0001
0x0002 //= 2 = 000000000000 0010
0x0004 //= 4 = 000000000000 0100
0x0008 //= 8 = 000000000000 1000
...
0x0010 //= 16 = 0000 0000 0001 0000
0x0020 //= 32 = 0000 0000 0010 0000
...
0x8000 //= 32768 = 1000 0000 0000 0000

참고URL : https://stackoverflow.com/questions/13222671/why-are-flag-enums-usually-defined-with-hexadecimal-values

반응형