soma0sd

코딩 & 과학 & 교육

mount & blade 모딩: 아이템 플래그 (2)

반응형

이전 글 "mount & blade warband 모딩: 아이템 플래그"에서,

0x0001000~0xFFFF000는 보조속성입니다. 추정입니다만, 이 속성은 복수로 선택할 수 있습니다. 값이 1, 2, 4, 8이니 2진법으로 보면 각각 다른 자릿수거든요.

라고 했었습니다. 이 부분을 직접 확인하고 해결해 보도록 하겠습니다.

각 자릿수의 플래그를 판단하는 방법

if flag_digit == 1:
    pass   # 1
elif flag_digit == 2:
    pass  # 2
elif flag_digit == 3:
    pass  # 1, 2
...
elif flag_digit == 15:
    pass  # 1, 2, 4, 8

이것은 하나의 16진법 자릿수 flag_digit의 값에 따라 각각의 플래그를 조합해서 사용했을 경우까지 생각해 1부터 15까지 모든 수에 대응하는 규칙을 만드는 방법입니다. 그런데, 앞에서는 비트연산을 사용해놓고 지금은 굳이 이래야 하나 싶습니다.

16진법과 2진법

앞서 플래그를 분해할 때 사용한 AND(A & B), OR(A | B)등 비트연산에 들어가는 값은 16진수를 사용하지만 비트연산자는 2진수 연산을 기본으로 합니다. 그러므로, 이전 글에서 플래그를 자릿수별로 분해할 때 사용했던 & 0xFF는 사실 & 0b1111 1111를 기준으로 계산한 것입니다.

2진법 16진법 2진법 16진법
0b0000 0x0 0b1000 0x8
0b0001 0x1 0b1001 0x9
0b0010 0x2 0b1010 0xA
0b0011 0x3 0b1011 0xB
0b0100 0x4 0b1100 0xC
0b0101 0x5 0b1101 0xD
0b0110 0x6 0b1110 0xE
0b0111 0x7 0b1111 0xF

비트연산 사용

파이썬의 장점 중 하나는 몇 진법으로 표현했는지에 관계없이 모든 int끼리의 연산을 지원한다는 점입니다. 이를 이용해서 다음과 같이 4개의 조건문으로 끝낼 수 있습니다.

if flag_digit & 0b0001:
    # 플래그 1 사용
if flag_digit & 0b0010:
    # 플래그 2 사용
if flag_digit & 0b0100:
    # 플래그 4 사용
if flag_digit & 0b1000:
    # 플래그 8 사용
반응형
태그:

댓글

End of content

No more pages to load