Muszę przetasować 16-bitową liczbę całkowitą bez znaku w taki sposób, aby indeksy parzystości wylądowały w dolnym bajcie, a indeksy nieparzyste wylądowały w górnym bajcie.Jak mogę wydajnie przetasować bity?
input:
fedcba(contiguously numbered)
output:
fdb97531 eca86420 (even and odd separated)
Mój kod wygląda w tej chwili:
typedef unsigned short u16;
u16 segregate(u16 x)
{
u16 g = (x & 0x0001);
u16 h = (x & 0x0004) >> 1;
u16 i = (x & 0x0010) >> 2;
u16 j = (x & 0x0040) >> 3;
u16 k = (x & 0x0100) >> 4;
u16 l = (x & 0x0400) >> 5;
u16 m = (x & 0x1000) >> 6;
u16 n = (x & 0x4000) >> 7;
u16 o = (x & 0x0002) << 7;
u16 p = (x & 0x0008) << 6;
u16 q = (x & 0x0020) << 5;
u16 r = (x & 0x0080) << 4;
u16 s = (x & 0x0200) << 3;
u16 t = (x & 0x0800) << 2;
u16 u = (x & 0x2000) << 1;
u16 v = (x & 0x8000);
return g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v;
}
Zastanawiam się, czy istnieje bardziej eleganckie rozwiązanie niż po prostu ekstrakcji i przesuwanie każdy pojedynczy bit?
„wygląda bardzo powolny” Put profilera na nim . To ci powie, czy to rzeczywiście powolne. – Almo
Wygląda na powolny, ale czy * faktycznie * zbyt wolno dla danej aplikacji? Zmierz dwukrotnie, wytnij jeden raz. –
[Podobne] (http://stackoverflow.com/questions/4909263/how-to-efficiently-de-interleave-bits-inverse-morton), myślę. – jrok