【发布时间】:2015-09-11 01:10:45
【问题描述】:
我有以下功能:
uint16_t foo(uint8_t input)
{
uint16_t N = 38;
if (!(input&1))
{
N = 0;
}
else
{
if ((input&2) >> 1)
{
N = ~N;
}
}
return N;
}
我想在不使用ifs 的情况下重写它,就像一个内联函数,将38 转换为0,38 或65497,给定input,并且只使用标准C 位旋转操作。
关键不是编译器可以内联函数,或者函数要快,而只是为了摆脱分支并保持恒定时间,而不管input 是什么。
第一个if很简单:
uint16_t c = ((input&1)^1)-1;
N &= c;
但我很难找到一些简单的方法来进行条件否定。
【问题讨论】:
-
那你的目标是什么?基本上,任何在 C 语言之后诞生的 ISA 至少有一种方法可以做到
x=cond?y:z快,真的快。 -
我的目标是 MCU - MSP430,它的指令集非常有限。不管
input是什么,关键不是要快,而是要保持恒定时间。 -
用全 0 或全 1 的掩码进行异或运算的条件补码:
N = N ^ (0 - ((input&2) >> 1))。 -
如果您陈述您所面临的实际问题,您可能会得到更好的答案。我怀疑这里有XY-problem。
标签: c optimization bit-manipulation inline