如何简化8*4图像行重排(swizzle rows)的像素索引计算公式?
图像行重排的简洁公式优化
我们有一张8×4的图像,常规像素索引顺序如下:
// 00 01 02 03 04 05 06 07 // 08 09 10 11 12 13 14 15 // 16 17 18 19 20 21 22 23 // 24 25 26 27 28 29 30 31
需要将行重排为以下顺序:
// 00 01 02 03 04 05 06 07 // 16 17 18 19 20 21 22 23 // 08 09 10 11 12 13 14 15 // 24 25 26 27 28 29 30 31
已实现的公式为:
index / 8 % 2 * 16 + index / 16 * 8 + index % 8
可以用位运算实现更简洁的等价逻辑,利用二进制位交换的特性:
(index & 0x7) | ((index & 0x8) << 1) | ((index & 0x10) >> 1)
原理说明
每个像素索引的二进制可拆分为5位:b4 b3 b2 b1 b0,其中:
b4(16的位):区分行组(0对应行0-1,1对应行2-3)b3(8的位):区分组内的行(0对应行0/2,1对应行1/3)b2-b0:列索引(0-7)
重排需求本质是交换b4和b3位:
- 原行1(
b4=0, b3=1)→ 交换后变为b4=1, b3=0,对应新行2的位置 - 原行2(
b4=1, b3=0)→ 交换后变为b4=0, b3=1,对应新行1的位置 - 行0(
b4=0, b3=0)和行3(b4=1, b3=1)交换后位不变,位置保持原样
位运算公式通过保留低3位列索引,交换8位和16位的位置,完美实现需求,比原公式更高效且简洁。
内容的提问来源于stack exchange,提问作者aybe
相关产品推荐
相关产品推荐

