将uint32_t数字的16个偶数位移到上半部分并将16个奇数位移到下半部分的示例代码:
uint32_t separateBits(uint32_t x)
{
uint32_t even = 0, odd = 0;
for (int i=0; i<32; i+=2)
{
even |= (x & (1 << (i+0))) >> (0 + i/2);
odd |= (x & (1 << (i+1))) >> (1 + i/2);
}
return (even << 16) | odd;
}
是否还有其他无效的方法,或者可以用来有效执行相同操作的bit hacks?这主要是针对手机的,因此如果可以使用专门针对手臂的指令。
编译布防时看起来像clang already unrolls loops,因为生成的代码看起来并不像实际的C代码。
例如,在intel this can be done this way上:
uint32_t separateBits(uint32_t x)
{
uint32_t even = _pext_u32(x, 0x55555555);
uint32_t odd = _pext_u32(x, 0xaaaaaaaa);
return (even << 16) | odd;
}