我很新,计算本身更"技术"的一面,所以如果这是一个愚蠢的问题,请耐心等待。 我错过了一个可能很明显的观点,但是为什么标志+位掩码比一堆相同大小的布尔值更节省内存,考虑到您不必初始化多达 32 个整数来填充flag
?
它们只是计算速度更快,还是占用的内存更少(如果是这种情况,我迷路了)。
我正在检查这些,但我没有看到我的问题:
- 为什么使用标志+位掩码而不是一系列布尔值?
- http://www.vipan.com/htdocs/bitwisehelp.html
编辑:@EJP这就是我从那个 vipan.com 通过"初始化"得到的。 整数有 32 个实例化,占用 (4 字节 * 32),而 (1 字节 * 32) 相当于 32 个布尔值:
// Constants to hold bit masks for desired flags
static final int flagAllOff = 0; // 000...00000000 (empty mask)
static final int flagbit1 = 1; // 2^^0 000...00000001
static final int flagbit2 = 2; // 2^^1 000...00000010
static final int flagbit3 = 4; // 2^^2 000...00000100
static final int flagbit4 = 8; // 2^^3 000...00001000
static final int flagbit5 = 16; // 2^^4 000...00010000
static final int flagbit6 = 32; // 2^^5 000...00100000
static final int flagbit7 = 64; // 2^^6 000...01000000
static final int flagbit8 = 128; // 2^^7 000...10000000
//...
static final int flagbit31 = (int) Math.pow(2, 30); // 2^^30
//...
// Variable to hold the status of all flags
int flags = 0;
编辑:所以在这种情况下,flags
是我的标志变量。 但如果我想说,代表flags
中的一些价值,我会做一些flags = flagbit1 | flagbit2 | flagbit3 | ... | flagbit31
的形式。 为了将flags
设置为结果,我必须创建 32 个称为 flagbit# 的整数,这就是我要问的。
,使用位运算时,您不需要初始化最多 32 个整数来填充标志.
您需要的是所有标志的一个变量。例如,整数变量能够表示大约 32 个标志。因此,在这种情况下,您的内存效率约为 32 位.
另一方面,如果使用布尔值来表示标志,则必须初始化所需数量的标志的布尔值。每个布尔变量本身大约有 32 位。因此,在这种情况下,您的内存效率约为 32 * 32 位
不仅位在内存效率方面更好,而且就我而言,它们比布尔数组快得多。
来自 Java 虚拟机规范
The Java Virtual Machine encodes boolean array components using 1 to represent
true and 0 to represent false. Where Java programming language boolean values
are mapped by compilers to values of Java Virtual Machine type int, the compilers
must use the same encoding.
所以显然有一个开销。
语言中的布尔值通常在内部表示为字节(有时是单词)。
文章"为什么使用标志+位掩码而不是一系列布尔值?枚举通常是整数。 但它也代表了一个信号量。 机器/语言的整数大小往往不同。 通常,枚举的用处是项目的奇异状态。
如果你玩二进制数学,你会发现它比十进制更有效。 处理器做所有二进制的东西。 当他们整数时 - 他们是假的,他们将其转换为二进制(位)。所以没有"伪造"它的开销