重写没有分支的代码

Num*_*our 3 c optimization bit-manipulation inline

我有以下功能:

uint16_t foo(uint8_t input)
{
     uint16_t N = 38;
     if (!(input&1))
     {
       N = 0;
     }
     else 
     {
        if ((input&2) >> 1)
        {
           N = ~N;
        }
     }
     return N;
}
Run Code Online (Sandbox Code Playgroud)

我想有它改写没有ifs,就像其将内联函数38到任意0,3865497给予input,并且仅使用标准C位变换操作.

关键不在于编译器可以内联函数,或者函数是快速的,而只是为了摆脱分支并且无论是什么都是恒定时间input.

第一个if很简单:

uint16_t c = ((input&1)^1)-1;
N &= c;
Run Code Online (Sandbox Code Playgroud)

但我找到一些简单的方法去做有条件的否定我遇到了麻烦.

cwa*_*ach 5

使用表查找.

uint16_t foo(uint8_t input) {
    int index= input & 0x3;
    const uint16 table[4]= {0,~38,0,38};
    return table[index];
}
Run Code Online (Sandbox Code Playgroud)