【问题标题】:How to find out how long an array has to be when being initialized? [duplicate]如何找出一个数组在初始化时需要多长时间? [复制]
【发布时间】:2017-10-20 16:29:32
【问题描述】:

假设我有一个字节数组 ID。

稍后我想以这种方式存储数据:

ids[cz << 24 | cx << 16 | y << 8 | z << 4 | x]

cz, cx, y, y, z, x 在这种情况下是 int 值。

那么当我创建数组时需要多长时间? 我以为我必须以这种方式初始化数组:

byte[] ids = new byte[maxCz * maxCx * maxY * maxZ * maxX];

但它总是给我一个 ArrayIndexOutOfBoundsException。

【问题讨论】:

  • 不知道maxCzmaxCxmaxZmaxX 是什么,在这里很难为您提供帮助。
  • 它们代表 cz、cx、x、y、z 的最大值。例如:int cx = 7,int cz = 7,x = 16,y = 256,z = 16。
  • 会是什么?
  • 数组大小必须容纳最大潜在索引值,所以简单版本是ids[(maxCz + 1) &lt;&lt; 24]。复杂版本是ids[(maxCz &lt;&lt; 24 | maxCx &lt;&lt; 16 | maxY &lt;&lt; 8 | maxZ &lt;&lt; 4 | maxX) + 1]。在这两种情况下,我都假设最大值包括在内。

标签: java arrays byte byte-shifting


【解决方案1】:

OR-ed 表达式中最大的组件是cz &lt;&lt; 24。假设maxCz 为 2k-1,并且剩余的max 值的选择方式使不同组件的位不重叠,则需要分配

byte[] ids = new byte[(maxCz+1) << 24];

maxCz 为 7 时,这是一个 128 MB 的分配,所以数组会非常大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2022-06-15
    • 2020-01-30
    • 2011-03-30
    • 2018-12-27
    相关资源
    最近更新 更多