当做一些麻烦和删除分支时,会不时弹出以下问题:
假设我有一个整数二进制标记f
,可以是0
或1
。如何将其分别转换为-1
和1
(或者相反,根据您的判断 - 通常可以使用其中一个)。一种常见的方式是:
int i = 2*f - 1;
但是这使用了加法和乘法。可以更快地完成吗?
答案 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;
要有条件地添加或减去数字,只需有条件地否定它,然后始终使用加法。