这是一种简单的压缩,其中您使用一个数值变量来存储许多布尔/二进制状态,并使用加倍,并且每个加倍数均为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
属性。它们可以使您的代码简单得多。