Java数学函数,用于将正整数转换为负整数,将负整数转换为正整数?

Java数学函数,用于将正整数转换为负整数,将负整数转换为正整数?,java,math,Java,Math,是否有Java函数将正整数转换为负整数,将负整数转换为正整数 我正在寻找一个reverse函数来执行此转换: -5 -> 5 5 -> -5 那么x*=-1?你真的想要一个库函数吗?只需使用一元减号运算符: Java有两个缺点: 熟悉的算术版本(例如0-x),以及 一元减号运算(此处使用),它对(单个)操作数求反 这将按照预期进行编译和工作 x = -x; 这可能是我在任何地方见过的最微不足道的问题 。。。还有一个谜团是,为什么要将这个微不足道的函数称为“revers

是否有Java函数将正整数转换为负整数,将负整数转换为正整数

我正在寻找一个
reverse
函数来执行此转换:

-5  ->  5
 5  -> -5

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

只需使用一元减号运算符:

Java有两个缺点:

  • 熟悉的算术版本(例如
    0-x
    ),以及
  • 一元减号运算(此处使用),它对(单个)操作数求反
这将按照预期进行编译和工作

x = -x;
这可能是我在任何地方见过的最微不足道的问题

。。。还有一个谜团是,为什么要将这个微不足道的函数称为“reverse()”。

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

它首先进行一个一的补码(通过对所有位进行补码),然后将1和x相加。这种方法也能起作用

注意:此方法是用Java编写的,与许多其他语言类似
显然,
x*=-1太简单了。

相反,我们可以使用一个简单的二进制补码:

public int reverse(int x){
    x~=x;
    x++;
    return x;
}
number = ~(number - 1) ;
像这样:

import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        int iPositive = 15;
        int iNegative = ( ~(iPositive - 1) ) ; // Use extra brackets when using as C preprocessor directive ! ! !...
        System.out.println(iNegative);

        iPositive =  ~(iNegative - 1)  ;
        System.out.println(iPositive);

        iNegative = 0;
        iPositive = ~(iNegative - 1);
        System.out.println(iPositive);


    }
}

这样我们就可以确保平庸的程序员不了解正在发生的事情;)

此类函数不存在或无法写入


问题是edge case Integer.MIN_值(-2147483648=0x80000000)应用上述三种方法中的每一种,得到相同的值。这是由于整数的表示形式和最大可能的integer.MAX_值(-2147483647=0x7fffffff)比-integer.MIN_值少一个。

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


不,你可能不应该用它。除非您需要一个。

您可以使用减号运算符或Math.abs。这些函数适用于除Integer.MIN_值之外的所有负整数! 如果使用0-MIN\u值,则答案仍然是MIN\u值。

original*=-1

简单的代码行,原始值是您想要的任何整数。

您可以使用数学:

int x = Math.abs(-5);

我们可以使用以下方法反转Java数字int或double:

int x = 5;
int y = -7;

x = x - (x*2); // reverse to negative
y = y - (y*2); // reverse to positif

反转数字的简单算法:)

最简单的方法是0-值

例如,如果int i=5

0-我会给你-5

如果我是-6


0-我会给你6个

在科特林,你可以使用一元加号和一元减号

input = input.unaryPlus()

@pst不,不会的。至少不支持JDK1.6.0_11;对我来说,错误的答案被接受了。这是一个有效的答案,但鉴于OP要求更改int的符号,因此不必担心负零或其他概念,我建议x=-x更具表达力(参见下面EJP的答案)…之前评论的附录:参见Bohemian的答案,因为它更详细地解释了一元运算符detail@FailedDev当然但我说它更有表现力(而不是更好的性能),这个答案是不正确的。int的最小值为-2^31,最大值为2^31-1,这意味着在特定情况下,当您需要转换Integer.MIN_值时,这将不起作用,也不会引发异常(我认为这是非常糟糕的):and int x=5;x=-x;如果您希望您的代码对这种情况具有健壮性,Java 8提供了一种在尝试对最小值求反时抛出
算术异常
,而不是静默返回错误结果的方法。这在x=Integer.MIN\u值的情况下不起作用,并且将静默失败*。为了安全起见,您应该检查这种情况并抛出一个异常,或者使用库函数negateExact,它正是这样做的。@rdl这里的每个答案几乎都是如此。请注意,如果x是短的或字节,它将不会编译,而
x*=-1
会编译。当我发现这就是我看到这一页的原因时,我有点惊讶:)当然你可以强制转换,但我是自动生成代码的,其中x可以是字节,短,int或long…@davegriffith您是在自动生成代码来更改变量的符号吗?是的-解析符号出现在数字后面的部分:)实际上不要这样做,只需执行
x=-x
。从汇编的角度来看,
-x
是一个简单的
neg
指令,而
-x
+x
需要
添加
指令。这是如何将
5
变成
-5
?可能是
var=Math.abs(var)*-1Math.abs()。它不会反转符号。用
-x
x*-1
代替。不知怎的,我只能想到
*(-1)
,而不用'0-`。谢谢
input = input.unaryPlus()