二进位,改变位

问题描述 投票:0回答:2

欢迎计算机科学家,

问题:

我有一系列的索引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位。

python c binary sse
2个回答
© www.soinside.com 2019 - 2024. All rights reserved.