1

对于我的 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;
    }
}

澄清:符号的值在编译时是未知的!

现在,我分别使用signed整数值为-1, 0,1的 C ,操作是 C 乘法myint * mysign。但我想知道这是否对性能有影响:对于每个带符号的多重操作,都使用了一个硬件乘法,它可能比否定要慢 | 设置为 0 | 不要碰。

在 C 中执行此操作的理想方法是什么?

如果我们从符号值中去掉值 0(所以只有 -1 和 1 有效),那么理想的方法是什么?

如果你告诉我它们在哪里,特定于架构的黑客/标准不符合是非常好的。

4

3 回答 3

11

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

它非常清晰简洁,仅依赖于整数的基本(易于理解的)数学属性。

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

此外,做一个乘法消除了分支来“决定”做什么的需要,这通常比跳来跳去做一些“更简单”的事情要好得多(很多)。

于 2013-06-14T14:44:15.437 回答
1

这几乎肯定不是性能瓶颈。只需使用普通的 int。

顺便说一句,您确实意识到采用 int min 的负数会导致未定义的行为?通常你会得到同样的东西,但你可能想要定义-fwrapv或确保这一点。

于 2013-06-14T14:44:39.073 回答
0

如果您使用的是没有快速硬件乘法的小型微控制器,那么您应该逐个进行。在这种情况下,分支的开销也很小。

否则只需使用乘法。

于 2013-06-14T15:04:21.847 回答