如何从代码中消除条件?

时间:2010-09-22 21:48:36

标签: java

如何从下面的代码中删除三元运算符?我正在寻找只使用整数运算符(移位,加法等)的东西。

a = (a < 0) ? (-a * 2) - 1 : (a * 2)

6 个答案:

答案 0 :(得分:7)

假设aint

,我不知道如何
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)