如何有效地将两个16位字组合成一个32位字?

use*_*687 5 c embedded performance bitwise-operators

我必须将两个16位字组合成一个32位字数百次,这需要很多计算能力.我想找到一种更有效的方法来做到这一点.

我有2个16位字,名为A和B.我想要一个名为C的32位字.A中的位应复制到C中的偶数位.B中的位应复制到奇数位中. C.例如:A:0b0000000000000000 B:0b1111111111111111处理后的C应为0b10101010101010101010101010101010.

我目前的解决方案如下:

for (i = 0; i < 32; i+=2)
{
    C |=  (A & (1 << (i/2))) << (i/2);
    C |=  (B & (1 << (i/2))) << (i/2 + 1);
}
Run Code Online (Sandbox Code Playgroud)

当我有几百个C要处理时,这个解决方案需要花费太多时间.我正在寻找一个更好的!

补充:该程序在TriCore上运行.我别无选择,只能以这种方式处理数据,因为AB和C之间的这种关系是由协议定义的.

谢谢!

Chr*_*odd 6

事实证明,Tricore有一个BMERGE完全符合你想要的指令 - 它需要两个16位值并对这些位进行交错.如果您使用的是基于gcc的工具链,则应该能够使用单个内联asm语句 - 类似于:

asm("bmerge %0,%1,%2" : "=r"(C) : "r"(A), "r"(B))
Run Code Online (Sandbox Code Playgroud)

还有一条BSPLIT指令反过来.


Jab*_*cky 0

尝试这个 :

for (i = 0; i < 32; i+=2)
{
    int i2 = i >> 1 ;
    int andval = 1 << i2 ;
    C |=  (A & andval) << i2;
    C |=  (B & andval) << (i2 + 1);
}
Run Code Online (Sandbox Code Playgroud)

但你的编译器可能已经完成了这个优化。