2012-08-30 46 views
2

作爲後續的previous question高階位 - 放下它們,右移

比方說,你有一個uint64_t中和只關心你的uint64_t非高位每個字節。像這樣:

0111.1111 0111.1111 0111.1111 0111.1111 0111.1111 0111.1111 0111.1111 0111.1111 

--->

0000.0000 1111.1111 1111.1111 1111.1111 1111.1111 1111.1111 1111.1111 1111.1111 

是否有每7位部分向右移動超過了掩蔽每個部分,右移,並加入到下一更快的方法?

不幸的是,我沒有熱AVX指令,允許快速和一般的位收集;我只能訪問SSE2指令。

回答

3

你可以用三個面具和輪班做到這一點。

u64 val; 

// remove bits at 7, 23, 39, 47 
u64 odd8 = val & 0x7f007f007f007f00L; 
u64 even8 = val & 0x007f007f007f007fL; 

val = (odd8 >> 1) | even8; 

// remove bits at 15-16, 23-24 
u64 odd16 = val & 0x3FFF00003FFF0000L; 
u64 even16 = val & 0x00003FFF00003FFFL; 

val = (odd16 >> 2) | even16; 

// remove bits at 31-35 
u64 odd32 = val & 0x0FFFFFFF00000000L; 
u64 even32 = val & 0x000000000FFFFFFFL; 

val = (odd32 >> 4) | even32;