将'X'转换为1或0,如果它的> 0或== 0

时间:2010-10-05 07:43:24

标签: java algorithm

目前,我的算法是someValue + x。我试图弄清楚如果x大于0,我可以将x转换为1,如果等于0,我可以将其转换为0。

我不想使用if-else来生成它,而只是在我的算法中单独转换someValue = 20

例如:如果x = 420 + 1 = 21。它会产生x = 0。但是如果{{1}}。它只会产生20个。

感谢。

10 个答案:

答案 0 :(得分:15)

为什么要在没有if语句的情况下执行此操作可能会有问题但是(从Java 5开始)Integer具有signum方法,该方法将返回-1,0或1在整数值上:

int newVal = someValue + Integer.signum (x);

假设您的输入值始终为零或更多,这将满足您的需要。但它不可能比if语句更快,如:

int newVal = someValue;
if (x > 0) newVal++;

也不比三元版更简洁:

int newVal = (x > 0) ? someValue + 1 : someValue;

我只是将其作为一个选项添加,以防您既不需要if也不需要三元变体。

答案 1 :(得分:7)

使用

someValue + (x>0? 1: 0);

但是不要担心写一点来得到你需要的东西。编写可理解的代码非常重要:)

答案 2 :(得分:3)

操作简单,你可以使用这个

 n + (x>0? 1 : 0);

答案 3 :(得分:2)

假设x始终为>=0,您可以这样做:

x = (x > 0) ? 1 : 0;

答案 4 :(得分:2)

使用someValue +(x> 0)?1:0最多应相当于:

if(x> 0)someValue ++;

编译时,不会避免分支。如果您出于某种原因绝对不得不避免分支,您可以使用:

X = - ((〜(X-1)| X)>> 31);

作为奖励,对于C语言,这将是:

X =(〜(X-1)| X)>>(的sizeof(X)* CHAR_BIT-1)

如果x == 0则结果为0,否则为1。它是纯粹的按位运算,没有分支和总共5个整数运算。对于类似的技巧(虽然没有列出这个,我只是在那里修改了另一个算法),你可以看到这个有点麻烦的黑客页面:http://graphics.stanford.edu/~seander/bithacks.html

答案 5 :(得分:2)

如果x是非负整数:

return someValue + (x + 2)%(x + 1);

答案 6 :(得分:1)

返回x> 0? someValue + 1:someValue;

但无论如何它最终会以条件语句结束。你只是不明确地做。

答案 7 :(得分:1)

为了便于阅读,请为条件部分定义一个额外的方法:

 public static int absoluteSignum(int x) {
   return x == 0 ? 0 : 1;
 }

并在您的代码中使用它:

 int result = someValue + absluteSignum(x);

答案 8 :(得分:1)

x=-((~(x-1)|x)>>31);

在我看来,这是最好的答案。但首先你应该将X存储为32位数据类型。 例如int(x86) 没有分支,没有判断

答案 9 :(得分:0)

只是在可能有效的混合物中抛出其他东西(但不一定是明智的方式)...

int value = 0;
try {
    value = x / x;
}
catch (Exception e) { }
return someValue + value;