使用int标志代替布尔值

时间:2013-08-02 02:36:12

标签: java android

因此,例如,Notification具有以下标志:

public static final int FLAG_AUTO_CANCEL = 0x00000010;

对于数字16,这是十六进制的。还有其他带有值的标志:

 0x00000020
 0x00000040
 0x00000080

每次,它的上升功率为2.将其转换为二进制,我们得到:

 00010000
 00100000
 01000000
 10000000

因此,我们可以使用按位运算符来确定哪些标志存在等,因为每个标志只包含一个1并且它们都位于不同的位置。

问题

这一切都很有道理,但为什么不使用booleans?这只是风格,还是有记忆或效率的好处?

修改
我理解通过组合它们,我们可以在一个int中存储大量信息。这是否仅使用 ,因此我们可以在单个int中传递大量布尔类型值,而不必传递大量参数?我并不是要轻视这一点,这很方便,但还有其他好处吗?

2 个答案:

答案 0 :(得分:2)

您所谈论的内容称为Bit Field。一个优点是所有信息都可以包含在单个变量中(没有像ArrayList那样的开销)。这对于保持函数签名整洁非常有用,并且由于堆栈操作较少而具有一些效率,但可能会被额外的位移操作所抵消。此外,您可以使用(例如)一个字节来存储8个字段,而不是浪费7个额外字节。如果你聪明的话,你也可以在一次操作中执行几次标记检查。

话虽如此,个人偏好可能会将布尔列表视为更清洁或更可取。位域在空间有限或具有某种性质的嵌入式系统中最常见。

参考你的编辑:它将标志的存储在整数中,但这些只是参考常量 - 你不是在编辑它们,而是将这些位插入(或者超出flags字段,其中单个int。我真的不知道他们为什么选择这个应用程序的位域;也许是那些在编程空间有限的微控制器中长大的人编写了特定的类。普遍的共识似乎是位域不应该包含在新代码中。

答案 1 :(得分:1)

这是C中常见的习惯用法,其中资源约束是一个更大的问题,您通常会在Java中看到Java API直接映射底层的知名C API。但是,由于种种原因,它在Java中并不是一个好主意。

从Java 5开始,EnumSet很好地处理了一位比特字段的大部分用法,它使用比特字段在内部实现(因此它非常快)但是类型安全,易于阅读,Iterable