我有一个object类,它告诉我数据的类型已经改变了。
object Part {
const val CONTRAST = 0x00000001
const val SATURATION = 0x00000010
const val PIXELATION = 0x00000100
const val SHARPNESS = 0x00001000
const val BRIGHTNESS = 0x00010000
const val ALL = 0x11111111
}在我的使用方法中,我检查数据的Part发生了什么变化。并且,只更新匹配的数据。
fun applyUpdate(flag: Int, percentage: Int) {
if (flag and Part.CONTRAST == flag) {
applyContrastUpdate(percentage)
}
if (flag and Part.SATURATION == flag) {
applySaturationUpdate(percentage)
}
.
.
}
// applyUpdate(Part.CONTRAST, 60) --> only contrast is updated.
// applyUpdate(Part.SATURATION, 30) --> only saturation is updated.
// applyUpdate{Part.ALL, 0}. --> all values are updated.我所理解的是0x0001 and 0x0001 = 0x0001 =对比。
但是,如果我定义了一个新的Part,比如说DISTORTION = 0x0011,那么失真的变化也会改变对比。
例如0x0011 and 0x0001 = 0x0001 =对比
使用这段代码,我可以定义最多8个Part。正确地放置1。对吗?如果我有36个Part,如何保持这个功能正常工作?
发布于 2020-04-13 14:00:21
EnumSets可能不像位标志那么容易出错。这是一个意见问题,但我认为,对于位标志,语法更容易使用。这样的位标志可以用于优化。在Android系统中,设计者非常反感,所以在平台代码中不使用enum。
如果你带着旗子去:
如果使用Long而不是Int,则最多可以有31个标志,而不是8个。或者63个标志。(不是32和64,因为第一个位用于符号。)您已经使用十六进制而不是二进制定义了您的常量,并且只使用了每个十六进制数字的一个可能值,所以您只使用了四分之一的可用位。
您可以使用每一位数的加倍值来定义它们,最多可达8:
object Part {
const val CONTRAST = 0x00000001
const val SATURATION = 0x00000002
const val PIXELATION = 0x00000004
const val SHARPNESS = 0x00000008
const val BRIGHTNESS = 0x00000010
const val SOMETHING = 0x00000020
const val ALL = 0x0000003F
}当您检查flag and Part.CONTRAST == flag时,您正在检查该标志是否只打开了CONTRAST。如果您想检查标志是否仅包含CONTRAST,您可以检查flag and Part.CONTRAST == Part.CONTRAST,或者更简洁地说:flag and Part.CONTRAST != 0。
https://stackoverflow.com/questions/61186038
复制相似问题