因此,例如,Notification具有以下标志:
public static final int FLAG_AUTO_CANCEL = 0x00000010;
对于数字16,这是十六进制的。还有其他带有值的标志:
0x00000020
0x00000040
0x00000080
每次,它的上升功率为2.将其转换为二进制,我们得到:
00010000
00100000
01000000
10000000
因此,我们可以使用按位运算符来确定哪些标志存在等,因为每个标志只包含一个1并且它们都位于不同的位置。
问题:
这一切都很有道理,但为什么不使用booleans
?这只是风格,还是有记忆或效率的好处?
修改
我理解通过组合它们,我们可以在一个int
中存储大量信息。这是否仅使用 ,因此我们可以在单个int
中传递大量布尔类型值,而不必传递大量参数?我并不是要轻视这一点,这很方便,但还有其他好处吗?
答案 0 :(得分:2)
您所谈论的内容称为Bit Field。一个优点是所有信息都可以包含在单个变量中(没有像ArrayList那样的开销)。这对于保持函数签名整洁非常有用,并且由于堆栈操作较少而具有一些次效率,但可能会被额外的位移操作所抵消。此外,您可以使用(例如)一个字节来存储8个字段,而不是浪费7个额外字节。如果你聪明的话,你也可以在一次操作中执行几次标记检查。
话虽如此,个人偏好可能会将布尔列表视为更清洁或更可取。位域在空间有限或具有某种性质的嵌入式系统中最常见。
参考你的编辑:它将标志的值存储在整数中,但这些只是参考常量 - 你不是在编辑它们,而是将这些位插入(或者超出flags
字段,其中是单个int。我真的不知道他们为什么选择这个应用程序的位域;也许是那些在编程空间有限的微控制器中长大的人编写了特定的类。普遍的共识似乎是位域不应该包含在新代码中。
答案 1 :(得分:1)
这是C中常见的习惯用法,其中资源约束是一个更大的问题,您通常会在Java中看到Java API直接映射底层的知名C API。但是,由于种种原因,它在Java中并不是一个好主意。
从Java 5开始,EnumSet很好地处理了一位比特字段的大部分用法,它使用比特字段在内部实现(因此它非常快)但是类型安全,易于阅读,Iterable
。