Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用int标志代替布尔值_Java_Android - Fatal编程技术网

Java 使用int标志代替布尔值

Java 使用int标志代替布尔值,java,android,Java,Android,因此,例如,具有以下标志: public static final int FLAG_AUTO_CANCEL = 0x00000010; 这是十六进制数字16。还有其他带有值的标志: 0x00000020 0x00000040 0x00000080 每次,它都以2的幂递增。将其转换为二进制,我们得到: 00010000 00100000 01000000 10000000 因此,我们可以使用位运算符来确定存在哪些标志,等等,因为每个标志只包含一个1,并且它们都位于不同的位置

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

public static final int FLAG_AUTO_CANCEL = 0x00000010;
这是十六进制数字16。还有其他带有值的标志:

 0x00000020
 0x00000040
 0x00000080
每次,它都以2的幂递增。将其转换为二进制,我们得到:

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

问题

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

编辑:

我知道通过组合它们,我们可以在单个
int
中存储大量信息。这是单独使用的吗?这样我们就可以在一个
int
中传递大量的布尔类型值,而不必传递大量的参数?我并不是说这很简单,这很方便,但还有其他好处吗?

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

话虽如此,个人偏好可能会认为布尔人的名单更干净或更可取。位域在空间有限或类似性质的嵌入式系统中最为常见


关于编辑:它将标志的值存储在整数中,但这些只是引用常量——你不是在编辑它们,而是将这些位插入(或移出)
标志
字段,这是一个整数。我真的不知道他们为什么选择这个应用程序的位字段;也许是某个在编程空间有限的微控制器中长大的人编写了这个特定的类。普遍的共识似乎是新代码中不应包含位字段

这是C语言中的一个常见习惯用法,在C语言中,资源约束是一个更大的问题,您通常在Java中看到它,Java API直接映射底层著名的C API。然而,在Java中这不是一个好主意,原因有很多


在Java5中,一位字段的大多数用法都由非常好地处理,它在内部使用一位字段实现(因此速度非常快),但它是类型安全的,易于阅读,并且可以使用
Iterable

“如果用户单击通知时应取消通知,则应设置标志字段中的位按位或。“。当然,每个标志的值存储在单独的变量中,但实际使用标志值允许存储在单个变量中。编辑:不确定上一条评论是否被删除或只是不显示,但可能此评论不再相关。我在答案中添加了更多内容。谢谢,我不熟悉
EnumSet
+1。