基于任意维度与位置,从二进制数/数组中选取三维点位
用位运算实现三维点位的二进制读写
核心思路
将三维坐标直接映射为二进制位的偏移量,通过位运算完成读写操作,彻底替代取模、除法这类低效运算,最大化性能。
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
相关产品推荐
相关产品推荐

