3

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

public static final int FLAG_AUTO_CANCEL = 0x00000010;

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

 0x00000020
 0x00000040
 0x00000080

每次,它都会增加 2 的幂。将其转换为二进制,我们得到:

 00010000
 00100000
 01000000
 10000000

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

问题

这一切都说得通,但为什么不直接使用booleans呢?这仅仅是风格,还是有记忆或效率方面的好处?

编辑:
我知道通过组合它们,我们可以将大量信息存储在一个int. 这是否单独使用,以便我们可以在一个单一的情况下传递大量布尔类型值,int而不必传递大量参数?我不是说小事,这很方便,但是还有其他好处吗?

4

2 回答 2

2

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

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

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

于 2013-08-02T02:46:21.377 回答
1

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

从 Java 5 开始,一位位域的大部分用途都由EnumSet很好地处理,它在内部使用位域实现(因此非常快),但类型安全、易于阅读和Iterable.

于 2013-08-02T06:18:13.903 回答