欢迎计算机科学家,
我有一系列的索引7 6 5 4 3 2 1 0
,我想通过以下方式使它们混乱:
7 6 5 4 3 2 1 0 = 7 6 5 4 3 2 1 0
_____| | | | | | | |_____
| ___| | | | | |___ |
| | _| | | |_ | |
| | | | | | | |
v v v v v v v v
_ 3 _ 2 _ 1 _ 0 7 _ 6 _ 5 _ 4 _
|___________________|
|
v
7 3 6 2 5 1 4 0
我可以使用以下方式在C中实现此行为:
int output =
((input & (1 << 0)) << 0) |
((input & (1 << 1)) << 1) |
((input & (1 << 2)) << 2) |
((input & (1 << 3)) << 3) |
((input & (1 << 4)) >> 3) |
((input & (1 << 5)) >> 2) |
((input & (1 << 6)) >> 1) |
((input & (1 << 7)) >> 0);
但是显然很笨重。
我想知道是否可以在更少的机器指令中做些什么来更快地实现此行为。例如使用SSE?
我将其用于将2d带符号的整数矢量坐标打包为一个1d值,以在处理内存和缓存时保留邻近性。这个想法类似于移动设备上某些GPU使用的某些纹理布局优化。(i ^ 0xAAAAAAAA) - 0xAAAAAAAA
使用我所谈论的这种接近度的幂从2d转换为1d整数。(x + 0xAAAAAAAA) ^ 0xAAAAAAAA
只是相反的操作,从1d有符号整数到1d整数,仍然具有相同的属性。要使其变为2d并保留接近属性,我想交替使用x和y位。