我知道实现这个目标的一种可行方法:
int a = 7;
int b = -10;
public int makeSmaller(int num) {
int result = Math.abs(num) - 1;
if(num > 0) return result;
else return -result;
}
makeSmaller(a); //returns 6
makeSmaller(b); //returns -9
有没有更简洁的方法可以用来使这个更清洁一点?
修改
我希望该方法将结果更接近于零返回0,因此除以2或任何其他数字将不起作用。两者都不会乘以0.
答案 0 :(得分:4)
使用signum:
public static int makeSmaller(int val) {
return val-Integer.signum(val);
}
答案 1 :(得分:1)
使用Math.abs
并不能获得任何收益,因为您无论如何都在测试这个标志。
因此,更简洁的表述:
public int makeSmaller(int num) {
return num > 0? num-1 : num+1;
}
因为你说你想让它更接近零,你也应该检查零情况:
public int towardZero(int num) {
if (num == 0) return 0;
else return num > 0? num-1 : num+1;
}
答案 2 :(得分:1)
public int makeSmaller(int num) {
int result = Math.abs(num) - 1;
if(num > 0) return result;
else return -result;
}
为什么不呢?
public int makeSmaller(int num) {
return num - (num/Math.abs(num));
}
括号部分将始终与数字相同,并且始终为1(加号或减号)。
所以,鉴于7 ......
7 - (7 / | 7 |)= 7 - 1 = 6
鉴于-10 ......
-10 - ( - 10 / | -10 |)= - 10 - ( - 10/10)= -10 - ( - 1)= -10 + 1 = -9
答案 3 :(得分:0)
不太可读,但工作:
int q = -10;
final int s[] = new int[]{-1, 1};
q += s[(q>>>31)];
System.out.println(q); // print -9
int q = 10;
final int s[] = new int[]{-1, 1};
q += s[(q>>>31)];
System.out.println(q); // print 9
所以你可以把你的功能重写为:
final static int[] signsInc = new int[]{-1, 1};
public static int makeSmaller(final int num) {
return (num != 0) ? (num + signsInc[(num>>>31)]) : 0;
}