C:需要一个"标志"类型

Jo *_* So 1 c bit-manipulation

对于我的C计算,我需要一个可以执行以下操作的符号类型(可以使用关联的运算符):

type sign_t = -1 | 0 | 1

integer mult_sign(integer i, sign_t s)
{
    switch (s) {
    case -1: return -i;
    case 0: return 0;
    case 1: return i;
    }
}
Run Code Online (Sandbox Code Playgroud)

澄清:在编译时不知道符号的值!

现在,我用C signeds的整数值-1,0,1,分别和操作是C乘法myint * mysign.但我想知道这是否有性能影响:对于每个多符号操作,使用硬件乘法,这可能比否定更慢.设为0 | 别碰.

在C中这样做的理想方法是什么?

如果我们从符号值中取走值0(因此只有-1和1有效),那么理想的方法是什么?

如果你告诉我他们在哪里,建筑特定的黑客/标准不合格是非常好的.

unw*_*ind 11

乘法似乎是一个很棒的选择.

它非常简洁明了,仅依赖于整数的基本(易于理解)数学属性.

您没有多说您的执行环境,但在典型的桌面CPU上:s整数乘法很长一段时间是单周期的.所以很难想出更快的东西.

此外,进行乘法消除了分支以"决定"做什么的需要,这通常比跳转做"更简单"更好(更好).