标志+位掩码在 Java 中如何/为什么内存效率更高



我很新,计算本身更"技术"的一面,所以如果这是一个愚蠢的问题,请耐心等待。 我错过了一个可能很明显的观点,但是为什么标志+位掩码比一堆相同大小的布尔值更节省内存,考虑到您不必初始化多达 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.

所以显然有一个开销。

许多

语言中的布尔值通常在内部表示为字节(有时是单词)。
文章"为什么使用标志+位掩码而不是一系列布尔值?枚举通常是整数。 但它也代表了一个信号量。 机器/语言的整数大小往往不同。 通常,枚举的用处是项目的奇异状态。

如果你玩二进制数学,你会发现它比十进制更有效。 处理器做所有二进制的东西。 当他们整数时 - 他们是假的,他们将其转换为二进制(位)。所以没有"伪造"它的开销

最新更新