如何在Kotlin中使用一点存储配置?

时间:2018-10-11 05:39:40

标签: kotlin bitmask

例如,将config1-8存储到config

var config1 = false
var config2 = false
var config3 = false
var config4 = false
var config5 = false
var config6 = false
var config7 = false
var config8 = false
var config = 0

如果配置为

var config1 = false
var config2 = false
var config3 = false
var config4 = false
var config5 = false
var config6 = false
var config7 = false
var config8 = true

然后配置为1

如果配置为

var config1 = false
var config2 = false
var config3 = false
var config4 = false
var config5 = false
var config6 = false
var config7 = true
var config8 = false

然后配置为2

如果配置为

var config1 = false
var config2 = false
var config3 = false
var config4 = false
var config5 = false
var config6 = false
var config7 = true
var config8 = true

然后配置为3

然后如何检查整数中的每个配置值?如果config是3,怎么知道config 7和8是真的?

3 个答案:

答案 0 :(得分:2)

您要描述的是一个位向量,而Java(以及Kotlin的扩展名)具有针对此问题的内置解决方案EnumSet。示例:

object Demo {

    @JvmStatic
    fun main(args: Array<String>) {


        val configs: EnumSet<Config> = EnumSet.of(ONE, THREE, FIVE)


        println(configs.joinToString())
        // ONE, THREE, FIVE

    }

    enum class Config {
        ONE,
        TWO,
        THREE,
        FOUR,
        FIVE
    }

}

EnumSet将在内部使用位向量,但您无需手动对其进行处理。

文档中的相关部分:

  

用于枚举类型的专用Set实现。枚举集中的所有元素都必须来自创建集时明确或隐式指定的单个枚举类型。枚举集在内部表示为位向量。这种表示非常紧凑和高效。该类的时空性能应足够好,可以用作传统的基于int的“位标志”的高质量,类型安全的替代方法。如果它们的参数也是一个枚举集,那么即使是批量操作(如containsAll和retainAll)也应该很快运行。

答案 1 :(得分:1)

对于位计算,您需要手动将位定义为2的幂:

const val CONFIG8 = 1
const val CONFIG7 = 2
const val CONFIG6 = 4
...

然后,您可以使用or运算符来设置配置:

config = 0
config = config or CONFIG8 // = 1
config = config or CONFIG7 // = 3

要读取已设置的配置,请使用and运算符

config and CONFIG8 != 0 // true if 1 or 3 ...
config and CONFIG7 != 0 // true if 2 or 3 ...

答案 2 :(得分:1)

要以布尔值读取和写入布尔值,只需使用二进制掩码:

var config1 = true
var config2 = true
var config3 = false
var config4 = false
var config5 = false
var config6 = true
var config7 = true
var config8 = false


fun main(args : Array<String>) {
    var config = 0
    if(config1){ config = config or 0b10000000}
    if(config2){ config = config or 0b1000000}
    if(config3){ config = config or 0b100000}
    if(config4){ config = config or 0b10000}
    if(config5){ config = config or 0b1000}
    if(config6){ config = config or 0b100}
    if(config7){ config = config or 0b10}
    if(config8){ config = config or 0b1}

    println(config and 0b10000000 > 0)
    println(config and 0b1000000 > 0)
    println(config and 0b100000 > 0)
    println(config and 0b10000 > 0)
    println(config and 0b1000 > 0)
    println(config and 0b100 > 0)
    println(config and 0b10 > 0)
    println(config and 0b1 > 0)
}

输出将为

true
true
false
false
false
true
true
false