目前,我的算法是someValue + x
。我试图弄清楚如果x
大于0,我可以将x
转换为1,如果等于0,我可以将其转换为0。
我不想使用if-else来生成它,而只是在我的算法中单独转换someValue = 20
。
例如:如果x = 4
,20 + 1 = 21
。它会产生x = 0
。但是如果{{1}}。它只会产生20个。
感谢。
答案 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;