一、Math类中的abs()
public static int abs(int a) public static long abs(long a) public static float abs(float a) public static double abs(double a)
Java中的Math类提供了abs()方法来获取一个数的绝对值。该函数有四个重载版本,分别支持int、long、float和double类型的参数。
对于int和long类型的参数,返回值是整数类型;对于float和double类型的参数,返回值是浮点数类型。下面是几个使用Math.abs()函数的示例:
int a = -5; long b = -10L; float c = 3.14f; double d = -2.71828; int absA = Math.abs(a); long absB = Math.abs(b); float absC = Math.abs(c); double absD = Math.abs(d);
在上面的代码中,absA的值为5,absB的值为10,absC的值为3.14,absD的值为2.71828。
二、取模运算符实现绝对值
我们可以使用取模运算符实现绝对值函数,当然这种方法只适用于整数类型。具体做法是:如果输入的数是负数,就把它乘以-1,否则直接返回原数。下面是实现示例:
public static int abs(int a) { if (a < 0) { return -a; } return a; }
我们可以对这段代码进行优化,来消除if语句:
public static int abs(int a) { int mask = a >> 31; return (a + mask) ^ mask; }
三、Bitwise Tricks实现绝对值
使用位运算来实现绝对值函数,可以获得更高的效率。Bitwise Tricks的实现方式如下:
public static int abs(int a) { int mask = a >> 31; return (a ^ mask) - mask; }
利用位运算实现绝对值函数比上一种方法快得多,因此被认为是最优解。由于实现方法过于繁琐,不建议在正式代码中使用。
四、Guava库中的Math函数
Google的开源Java库Guava也提供了绝对值函数的实现,该函数被定义在com.google.common.math.DoubleMath类中,其函数名为abs()。
double abs(double x)
与Java的Math.abs()函数不同,Guava的abs()函数只有一种重载版本,且只支持double类型的参数。下面是使用Guava的abs()函数的示例:
double x = -3.14159; double absX = DoubleMath.abs(x);
五、BigInteger类中的abs()
Java中的BigInteger类也提供了一个abs()方法用于获取一个大整数的绝对值。
BigInteger abs()
该函数返回一个新的BigInteger类型对象,其值是输入参数的绝对值。下面是实例代码:
BigInteger a = new BigInteger("-123456789"); BigInteger absA = a.abs();
六、总结
本篇文章主要介绍了Java中取绝对值函数的几种实现方式,其中Java的Math类提供了最基础的实现方式。Bitwise Tricks是实现绝对值函数的最优解,但是使用过于繁琐。Guava库以及Java的BigInteger类也提供了对绝对值函数的支持。