두 개의 숫자를 사용하여 하나의 숫자 변수를 사용하여 여러 부울 / 이진 상태를 저장하는 일종의 간단한 압축 방식이며 모든 배가 숫자는 1 + 이전 숫자의 합계 + 1입니다.
나는 그것이 오래되고 잘 알려진 기술이어야한다고 확신합니다. 제대로 참조하기 위해 무엇을 부르는지 알고 싶습니다. 나는 그것을 설명하기 위해 생각할 수있는 모든 방법으로 여러 번 검색했지만 기사 작성자가 직접 알아 냈고 무엇을 호출 해야할지 모르는 블로그 기사 외에는 아무것도 발견하지 못했습니다 ( 예 1 , 예 2 ).
예를 들어, 다음은 개념을 설명하기위한 매우 간단한 구현입니다.
packStatesIntoNumber () {
let num = 0
if (this.stateA) num += 1
if (this.stateB) num += 2
if (this.stateC) num += 4
if (this.stateD) num += 8
if (this.stateE) num += 16
if (this.stateF) num += 32
return num
}
unpackStatesFromNumber (num) {
assert(num < 64)
this.stateF = num >= 32; if (this.stateF) num -= 32
this.stateE = num >= 16; if (this.stateE) num -= 16
this.stateD = num >= 8; if (this.stateD) num -= 8
this.stateC = num >= 4; if (this.stateC) num -= 4
this.stateB = num >= 2; if (this.stateB) num -= 2
this.stateA = num >= 1; if (this.stateA) num -= 1
}
비트 연산자, 기본 2 숫자 구문 분석, 열거 형을 사용할 수도 있습니다. 그것을 구현하는 더 효율적인 방법이 많이 있습니다. 접근 방식의 이름에 더 일반적으로 관심이 있습니다.
bool
는 일반적으로 내부적으로 32 비트 정수로 저장됩니다. 따라서 패킹은 32 배의 차이를 만들 수 있습니다. 정말 많은 부분입니다. 우리 프로그래머들은 항상 우리 자원의 절반을 버릴 준비가되어 있지만, 일반적으로 97 %를 버리는 것을 꺼려합니다. 이러한 낭비 요인으로 인해 중요한 사용 사례를 실행할 수있는 것과 메모리 부족이 쉽게 달라질 수 있습니다.
enums
가질 수 있습니다Flags
. 코드를 훨씬 간단하게 만들 수 있습니다.