优化"i = b?(i | mask):( i&〜mask)"

fad*_*bee 4 c bit-manipulation ternary-operator

我希望能够设置或清除(多个)a uintX_t t.

i是一个运行时变量(uintX_t). b是一个运行时变量(uintX_t),它被约束为01.

mask 是一个编译时常量.

有没有比以下更好的方式:

i = b ? (i | mask) : (i & ~mask)
Run Code Online (Sandbox Code Playgroud)

我希望避免分支,如果可能的话.目标是ARM,如果重要的话.

nwe*_*hof 6

利用-1u所有位设置的值这一事实:

i = (i & ~mask) | (mask & -b);
Run Code Online (Sandbox Code Playgroud)

要么

i ^= (i ^ -b) & mask;
Run Code Online (Sandbox Code Playgroud)

第二种方法减少了操作数和代码大小.第一种方法在超标量体系结构上可能仍然更快,因为某些操作可以并行执行.


Gui*_*zan 5

这里的想法是用乘法替换分支,我们可以根据b的值将每一边归零:

i = (i | (mask * b)) & (~mask | (mask * b));
Run Code Online (Sandbox Code Playgroud)


use*_*733 5

另一种选择:始终将位设置为0(左侧部分),并可选择将位设置为1(右侧部分).

i = (i & ~mask) | (mask * b);
Run Code Online (Sandbox Code Playgroud)