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

如何用位运算通过循环快速生成长方体的8个顶点?

长方体顶点生成的位运算实现

核心思路

8个长方体顶点正好对应3位二进制数(000 ~ 111),我们可以用顶点序号n的二进制位直接控制每个维度的加减系数:

  • 把n的二进制第dim位作为判断条件:位为1时系数取1(加半长),位为0时取-1(减半长)
  • 通过位运算(n >> dim) & 1快速提取对应位的值,避免手动枚举所有顶点的符号组合

代码实现

假设用C++风格代码实现,核心逻辑如下:

// 整理长方体的尺寸数组
float dimensions[] = { cub.width, cub.height, cub.depth };
Vec3 points[8];

// 嵌套循环生成所有顶点
for (int n = 0; n < 8; ++n) {
    for (int dim = 0; dim < 3; ++dim) {
        // 提取n的第dim位,判断符号
        bool usePositive = ((n >> dim) & 1) != 0;
        int coeff = usePositive ? 1 : -1;
        points[n][dim] = cub.center[dim] + coeff * dimensions[dim] / 2.0f;
    }
}

位运算解释

  • n >> dim:将顶点序号n的二进制值右移dim位,把目标位移到最低位
  • & 1:和1做按位与操作,保留最低位的值(0或1),以此确定当前维度是加还是减半长

举个例子,顶点序号n=5(二进制101):

  • dim=0(x轴):(5 >> 0) & 1 = 1 → 加x方向半宽
  • dim=1(y轴):(5 >> 1) & 1 = 0 → 减y方向半高
  • dim=2(z轴):(5 >> 2) & 1 = 1 → 加z方向半深

简化优化

如果想减少嵌套层级,也可以直接展开维度循环(仅3个维度,代码量可控):

float dimensions[] = { cub.width, cub.height, cub.depth };
Vec3 points[8];

for (int n = 0; n < 8; ++n) {
    points[n][0] = cub.center[0] + (((n >> 0) & 1) ? 1 : -1) * dimensions[0] / 2.0f;
    points[n][1] = cub.center[1] + (((n >> 1) & 1) ? 1 : -1) * dimensions[1] / 2.0f;
    points[n][2] = cub.center[2] + (((n >> 2) & 1) ? 1 : -1) * dimensions[2] / 2.0f;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:40:47