尽快将二进制标志变为-1或+1

时间:2012-08-26 14:11:18

标签: c optimization

当做一些麻烦和删除分支时,会不时弹出以下问题:

假设我有一个整数二进制标记f,可以是01。如何将其分别转换为-11(或者相反,根据您的判断 - 通常可以使用其中一个)。一种常见的方式是:

int i = 2*f - 1;

但是这使用了加法和乘法。可以更快地完成吗?

4 个答案:

答案 0 :(得分:3)

嗯,对于初学者,你可以做到

int i = (f << 1) - 1;

另外,你可以尝试

int i = f - (!f);

答案 1 :(得分:3)

你的原作实际上非常好 - 一个合理的优化者会把它变成:

int i = f + f - 1;

例如在x86上,这可以编译为单个指令。

答案 2 :(得分:0)

也许我错过了什么,但if (i == 0) i = -1;出了什么问题?

<编辑:编辑:没关系,我错过了一些东西。您希望结果采用单独的有符号整数。]

答案 3 :(得分:0)

要根据标记x有条件地否定f,您可以这样做:

int mask = f - 1;  // negate if f == 0, don't negate if f == 1
x = (x ^ mask) - mask;

或者这个:

int mask = -f;  // negate if f == 1, don't negate if f == 0
x = (x ^ mask) - mask;

要有条件地添加或减去数字,只需有条件地否定它,然后始终使用加法。