位操作可高效实现乘除2的幂次方,用于像素缩放、坐标变换等;左移替代乘法,逻辑右移替代除法(非负数),位与替代取模(2ⁿ对齐),多移位加减组合逼近任意常数乘法。
位操作实现乘除 2 的幂次方,在图形计算中能显著减少指令延迟、避免浮点开销,并适配硬件位移单元,特别适合像素缩放、坐标变换、内存对齐和纹理采样等高频整数运算场景。
图形处理中常需将颜色值放大(如伽马校正前的亮度提升)或把顶点坐标按比例缩放。用 x 替代 <code>x * (1 或 <code>x * pow(2, n),既快又无精度损失。
r16 = r8 (即 ×256),比 <code>r8 * 256 更直观且编译后为单条 sal 指令px *= 2 可直接写成 px ,语义清晰、零分支、无溢出风险(只要确保结果不超类型上限)
0x40000000 在 32 位 int 中会越界)
图像降采样(如生成 mipmap)、视口裁剪、块对齐等操作常需整数除法,而 x >> n 对非负 x 等价于 x / (1 并向下取整(即地板除),符合多数图形算法需求。
width_4x = width >> 2、height_4x = height >> 2,比除法快且可预测u_int = (x & 1023) 比 x % 1024 更快(见后文“掩码优化”)-5 >> 1 == -3,而 -5 / 2 == -2(向零截断)。图形管线中坐标多为非负,若涉及裁剪偏移,建议先转为无符号或加偏置再右移图形 API(如 Vulkan、OpenGL)常要求缓冲区大小、纹理宽高、线程组尺寸对齐到 2 的幂。此时用位与(&)代替取模(%),可省去除法器调用。
aligned_w = (w + 7) & ~7(~7 即 0xFFFFFFF8),比 ((w + 7) / 8) * 8 更简洁高效index = hash & 255 完全等价于 hash % 256,且无分支、无条件跳转当乘数不是 2 的幂(如 ×10 用于 YUV 转 RGB 的系数),可用多个左移加减组合,避免通用乘法指令。
x * 10 → (x (8x + 2x)
x * 7 → (x (8x − x)