从arm / neon中的整数有效解交织偶数和奇数位

时间:2018-08-05 20:17:33

标签: c++ arm bit-manipulation

将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;
}

0 个答案:

没有答案