You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于任意维度与位置,从二进制数/数组中选取三维点位

用位运算实现三维点位的二进制读写

核心思路

将三维坐标直接映射为二进制位的偏移量,通过位运算完成读写操作,彻底替代取模、除法这类低效运算,最大化性能。


1. 坐标到位偏移量的计算(x→y→z顺序)

假设三维体尺寸为 X_SIZE × Y_SIZE × Z_SIZE(比如8×8×8),坐标为 (x, y, z)(x范围0X_SIZE-1,y范围0Y_SIZE-1,z范围0~Z_SIZE-1),对应的位偏移量(从0开始计数)公式为:

offset = x + y * X_SIZE + z * X_SIZE * Y_SIZE

位运算优化(仅适用于尺寸为2的幂时)

如果X_SIZE、Y_SIZE是2的整数次幂(比如8=2³,4=2²),乘法可以替换为左移操作,速度更快:

  • 以8×8×8体为例:y * 8 = y << 3,z * 8 * 8 = z << 6,最终偏移量为 offset = x + (y << 3) + (z << 6)
  • 对应你给出的4×4×4体:X_SIZE=4(2²),Y_SIZE=4(2²),偏移量计算为 offset = 1 + (1 << 2) + (1 << 4) = 1 + 4 + 16 = 21,和示例中的位位置完全匹配。

2. 读操作:获取点位的0/1值

通过右移将目标位移到最低位,再与1按位与,即可得到该位的数值:

// 存储8×8×8体的512位数据,用8个64位无符号整数数组
uint64_t bitfield[8];

uint8_t get_bit(uint32_t x, uint32_t y, uint32_t z) {
    uint32_t offset = x + y * 8 + z * 64;
    uint32_t arr_idx = offset >> 6;    // 等价于 offset / 64,找到对应数组元素
    uint32_t bit_pos = offset & 0x3F;  // 等价于 offset % 64,找到元素内的位位置
    return (bitfield[arr_idx] >> bit_pos) & 1;
}

3. 写操作:设置点位的0/1值

设置为1

生成仅目标位为1的掩码,与原数据按位或:

void set_bit_to_1(uint32_t x, uint32_t y, uint32_t z) {
    uint32_t offset = x + y * 8 + z * 64;
    uint32_t arr_idx = offset >> 6;
    uint32_t bit_pos = offset & 0x3F;
    bitfield[arr_idx] |= (1ULL << bit_pos);
}

设置为0

生成仅目标位为0的掩码,与原数据按位与:

void set_bit_to_0(uint32_t x, uint32_t y, uint32_t z) {
    uint32_t offset = x + y * 8 + z * 64;
    uint32_t arr_idx = offset >> 6;
    uint32_t bit_pos = offset & 0x3F;
    bitfield[arr_idx] &= ~(1ULL << bit_pos);
}

关键优势

  • 完全规避取模、除法等低效运算,全部用位运算替代,高频调用场景下性能提升明显
  • 内存占用极低:8×8×8的三维体仅需512位(64字节),远小于同等规模的uint8_t数组(512字节)

内容的提问来源于stack exchange,提问作者Ferinix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:52:57