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