Ho bisogno di mescolare un numero intero senza segno a 16 bit in modo che gli indici pari vengano posizionati nel byte inferiore e gli indici dispari vengano posizionati nel byte superiore.Come posso mischiare i bit in modo efficiente?
input:
fedcba(contiguously numbered)
output:
fdb97531 eca86420 (even and odd separated)
mio codice è simile al momento:
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;
}
mi chiedo se c'è una soluzione più elegante che semplicemente estraendo e spostando ogni singolo bit?
"sembra molto lento" Mettere un profiler su di esso . Questo ti dirà se è effettivamente lento. – Almo
Sembra lento, ma è * effettivamente * troppo lento per la tua particolare applicazione? Misura due volte, taglia una volta. –
[Correlati] (http://stackoverflow.com/questions/4909263/how-to-efficiently-de-interleave-bits-inverse-morton), penso. – jrok