Java数学函数将正int转换为负数和负数转换为正数?

zip*_*ppy 44 java math

是否有一个Java函数将一个正整数转换为负一个而将负整数转换为正整数?

我正在寻找reverse执行此转换的功能:

-5  ->  5
 5  -> -5
Run Code Online (Sandbox Code Playgroud)

Fai*_*Dev 202

怎么样x *= -1;?你真的想要一个库函数吗?

  • @Gandalf这将无法正确将0.0转换为-0.0 ;-) (10认同)
  • 对我来说,错误的答案已被接受.这是一个有效的答案,但鉴于OP要求更改int的符号,所以不关心负零或其他概念,我建议x = -x更具表现力(参见下面的EJP答案). . (8认同)
  • @pst不,不会.至少不是JDK 1.6.0_11; D. (3认同)
  • 这个答案不正确。int 的最小值为 -2^31 ,最大值为 2^31-1 ,这意味着在特定情况下,当您需要转换 Integer.MIN_VALUE 时,这将不起作用,也不会抛出异常(我认为这真的很糟糕) (2认同)

use*_*421 77

x = -x;
Run Code Online (Sandbox Code Playgroud)

这可能是我见过的最微不足道的问题.

...以及为什么你会称这个琐碎的函数'reverse()'是另一个谜.

  • 这在x = Integer.MIN_VALUE并且将以静默方式失败*的情况下不起作用.为了安全起见,你应该检查这种情况并抛出一个异常,或者使用库函数negateExact,它就是这样做的. (3认同)
  • @rdllopes这同样适用于此处的每个答案. (3认同)

Boh*_*ian 47

只需使用一元减运算符:

int x = 5;
...
x = -x; // Here's the mystery library function - the single character "-"
Run Code Online (Sandbox Code Playgroud)

Java有两个减号运算符:

  • 熟悉的算术版本(例如0 - x)和
  • 所述一元减号操作(这里使用的),其否定(单)的操作数

这编译并按预期工作.


Shi*_*yal 10

另一种方法(2的补码):

public int reverse(int x){
    x~=x;
    x++;
    return x;
}
Run Code Online (Sandbox Code Playgroud)

它首先执行一个补码(通过补充所有位),然后将x加1.这种方法也可以完成这项工作.

注意:此方法是用Java编写的,并且与许多其他语言类似

  • 实际上不要这样做,只做`x = -x`.从汇编的角度来看,`-x`是一个简单的`neg`指令,而`~x`和`++ x`需要一个`not`和`add`指令. (5认同)

小智 7

原*= -1;

简单的代码行,原始代码是你想要的任何int.


Sal*_*lba 6

不存在此类功能或无法编写该功能。

问题在于边缘情况Integer.MIN_VALUE(-2,147,483,648 = 0x80000000)应用上述三种方法中的每一种,您都会得到相同的值。这是由于整数的表示形式以及最大可能的整数Integer.MAX_VALUE(-2,147,483,647 = 0x7fffffff),它比-Integer.MIN_VALUE少一。

  • 如果您希望代码在这种极端情况下更加健壮,则Java 8提供了[Math.negateExact](http://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#negateExact- int-)会在尝试取反MIN_VALUE时抛出`ArithmeticException`,而不是静默返回错误结果。 (7认同)

小智 5

是的,正如Jeffrey Bosboom已经指出的(抱歉,Jeffrey,我在回答时没有注意到您的评论),有这样一个函数:Math.negateExact

不,你可能不应该使用它。除非您需要方法引用,否则不会。


小智 5

最简单的做法是 0- 值

例如,如果 int i = 5;

0-我会给你-5

如果我是-6;

0-我会给你6