如何从下面的代码中删除三元运算符?我正在寻找只使用整数运算符(移位,加法等)的东西。
a = (a < 0) ? (-a * 2) - 1 : (a * 2)
答案 0 :(得分:7)
假设a
是int
:
a = 2*a*(1+2*(a>>31)) - (a>>>31);
>>
是算术(签名)左移。所以a>>31
用符号位替换所有位。所有位设置为-1。多个乘以2并加一个,负数转为-1,正数(和零)转为1。
>>>
是合乎逻辑的(无符号)左移。因此a>>>31
清除前31位并将符号位置于位0(0表示正数,0表示负数; 1表示负数)。
像这样模糊地做某事的“正确”方式是:
a ^= a>>31;
a *= 2;
答案 1 :(得分:3)
你所拥有的是几个答案,证明摆脱三元并不是一个好主意。这意味着您的代码难以阅读,难以调试,难以维护。您没有将此标记为家庭作业或智力锻炼,因此正确的答案是:不要。将三元保留在原位。很明显,它具有表现力,而且能够胜任。
答案 2 :(得分:2)
if (a < 0)
a = (-a * 2) - 1
else
a = (a * 2)
答案 3 :(得分:1)
这似乎有效:
a= (2 * Math.abs(a)) - (a >>> 31);
答案 4 :(得分:0)
它应该是这样的:
a = ((a ^ (a >> 31)) + 1) * 2 - ~(a >>> 31) - 1;
(我实际上并没有尝试过它 - 不是Java程序员。)
答案 5 :(得分:0)
更简单的答案是使用
(a ^ a >> 31) * 2 + (a >>> 31)