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,38或65497给予input,并且仅使用标准C位变换操作.
关键不在于编译器可以内联函数,或者函数是快速的,而只是为了摆脱分支并且无论是什么都是恒定时间input.
第一个if很简单:
uint16_t c = ((input&1)^1)-1;
N &= c;
Run Code Online (Sandbox Code Playgroud)
但我找到一些简单的方法去做有条件的否定我遇到了麻烦.
使用表查找.
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)