如何将锯齿状二维int数组扁平化并实现空间高效的x/y索引映射
最优实现方案
直接使用行优先线性映射即可完全满足需求,没有任何空间冗余,计算逻辑简单高效:
- 一维数组大小直接设为总行数 × 总列数,这里就是
22 * 22 = 484,完全无浪费 - x、y转一维索引公式:
index = x * 22 + y - 一维索引反向还原x、y公式:
x = index / 22y = index % 22
代码示例
// 创建扁平化数组 int[] arr = new int[22 * 22]; // 写入元素,直接用x、y定位 for (int x = 0; x < 22; ++x) { for (int y = 0; y < 22; ++y) { arr[x * 22 + y] = ...; // 赋值逻辑和原二维数组完全一致 } } // 单独用x、y读取元素 int target = arr[targetX * 22 + targetY]; // 从一维索引反推x、y int index = 123; int x = index / 22; int y = index % 22;
方案说明
你之前的位运算方案本质是把列数向上取整到了2的5次幂(32),才导致了空间冗余。如果你的场景没有强制要求必须用位运算做索引转换,上述乘除取模的方案是空间利用率100%的最优解,现代CPU对整数乘除的优化已经非常成熟,性能开销可以忽略。
如果确实需要用位运算提升计算速度,可以在列数本身就是2的幂次时使用,比如如果你的数组大小是32×32,再用(x << 5) | y的逻辑就没有空间浪费了。
内容的提问来源于stack exchange,提问作者NewUwpPerson
相关产品推荐
相关产品推荐

