如何/为什么flag + bitmask在java中的内存效率更高?

时间:2015-01-21 04:42:21

标签: java bit-manipulation

我对计算机的“技术”方面更加新颖,所以如果这是一个愚蠢的问题,请耐心等待。我错过了可能是一个明显的观点,但为什么标志+位掩码的内存效率比同等大小的布尔更多,考虑到你不必初始化多达32个整数来填充{{1} }?

它们只是计算速度更快,还是占用更少的内存(如果是这种情况,我就迷失了。)

我正在检查这些,但我没有看到我的问题:

编辑: @EJP 这就是我从vipan.com的“初始化”中得到的结果。有一个整数的32个实例,占用(4个字节* 32)而相当于32个布尔值(1个字节* 32):

flag

修改 所以在这种情况下,// 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设置为最终结果,我必须创建32个整数,名为flagbit#,这个是我要问的。

3 个答案:

答案 0 :(得分:0)

首先,在使用位操作时,您不需要初始化最多32个整数来填充标记。

你需要的是你所有旗帜的一个变量。例如,整数变量具有表示大约32个标志的容量。因此,在这种情况下,您的内存效率约为32位。

另一方面,如果你使用布尔值来表示你的旗帜,那么你必须将许多布尔值初始化为你想要的许多旗帜。每个布尔变量本身大约为32位。因此,在这种情况下,您的内存效率大约为32 * 32位 不仅位在内存效率方面更好,但就我而言,它们更快,然后是一组布尔值。

答案 1 :(得分:0)

来自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.

所以显然有一个开销。

答案 2 :(得分:-2)

许多语言的布尔值通常在内部表示为一个字节(有时候是一个单词) 艺术"为什么使用旗帜+位掩码而不是一系列布尔?"枚举通常是整数。但它也代表了一种信号量。机器/语言的整数大小往往不同。通常,枚举的有用性是项目的单一状态。

如果你玩二进制数学,你会发现它比十进制更有效。处理器在那里做二进制文件。当它们整数时 - 它们会伪造,它们会将其转换为二进制(位)。因此,没有任何“假装”的开销。它