【问题标题】:Java math function to convert positive int to negative and negative to positive?Java数学函数将正整数转换为负数并将负数转换为正数?
【发布时间】:2011-12-13 18:29:14
【问题描述】:

有没有一个Java函数可以将正整数转换为负整数,将负整数转换为正整数?

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

-5  ->  5
 5  -> -5

【问题讨论】:

标签: java math


【解决方案1】:

【讨论】:

    【解决方案2】:

    最简单的做法是0-值

    例如如果 int i = 5;

    0-i 会给你-5

    如果我是-6;

    0- 我会给你 6

    【讨论】:

    • 不知何故我只能想到* (-1),而不是使用`0 -`。谢谢
    【解决方案3】:

    我们可以使用这个来反转 Java 数字 int 或 double :

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

    反转数字的简单算法:)

    【讨论】:

      【解决方案4】:

      这里是死灵法师。
      显然,x *= -1; 太简单了。

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

      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);
      
      
          }
      }
      

      这样我们可以确保平庸的程序员不明白发生了什么;)

      【讨论】:

        【解决方案5】:

        你可以使用数学:

        int x = Math.abs(-5);
        

        【讨论】:

        • 这如何将5 变成-5
        • 可能是var = Math.abs(var) * -1;
        • 这明显是错误的。 Math.abs() 只是删除每个 - 符号。它不会反转符号。请改用-xx * -1
        【解决方案6】:

        原始 *= -1;

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

        【讨论】:

          【解决方案7】:

          您可以使用减号运算符或 Math.abs。这些适用于所有负整数,除了 Integer.MIN_VALUE! 如果您执行 0 - MIN_VALUE,则答案仍然是 MIN_VALUE。

          【讨论】:

            【解决方案8】:

            是的,正如Jeffrey Bosboom 已经指出的那样(对不起,杰弗里,我回答时没有注意到您的评论),有这样一个功能:Math.negateExact

            不,您可能不应该使用它。除非你需要method reference

            【讨论】:

              【解决方案9】:

              这样的函数不存在或无法编写。

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

              【讨论】:

              • 如果您希望您的代码对这种极端情况保持稳健,Java 8 提供了Math.negateExact,当尝试否定 MIN_VALUE 时会抛出ArithmeticException,而不是默默地返回错误结果。跨度>
              【解决方案10】:

              只需使用一元减号运算符

              int x = 5;
              ...
              x = -x; // Here's the mystery library function - the single character "-"
              

              Java 有 两个 减去 operators:

              • 熟悉的算术版本(例如0 - x),以及
              • 一元减法(在这里使用),它否定(单个)操作数

              这会按预期编译和工作。

              【讨论】:

                【解决方案11】:

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

                public int reverse(int x){
                    x~=x;
                    x++;
                    return x;
                }
                

                它首先进行一个补码(通过对所有位进行补码),然后将 1 加到 x。这种方法也能胜任。

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

                【讨论】:

                • 实际上不要这样做,只做x = -x。从汇编的角度来看,-x 是一个简单的neg 指令,而~x++x 需要一个notadd 指令。
                【解决方案12】:
                x = -x;
                

                这可能是我在任何地方见过的最琐碎的问题。

                ...以及为什么将这个微不足道的函数称为“reverse()”是另一个谜。

                【讨论】:

                • 这在 x = Integer.MIN_VALUE 的情况下不起作用并且会静默失败*。为了安全起见,您应该检查这种情况并抛出异常,或者使用库函数 negateExact,它正是这样做的。
                • @rdlllopes 这几乎适用于这里的每个答案。
                • 请注意,如果 x 是短字节或字节,它将不会编译,而 x *= -1 会。当我发现这就是我遇到这个页面的方式时有点惊讶:) 当然你可以转换,但我是自动生成代码,其中 x 可以是字节、短、整数或长......
                • @DaveGriffiths 您正在自动生成代码来更改变量的符号?
                • 是的 - 解析数字后面出现符号的东西:)
                【解决方案13】:

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

                【讨论】:

                • @pst 不会。至少 JDK 1.6.0_11 没有;D
                • 对我来说,错误的答案已被接受。这是一个有效的答案,但鉴于 OP 要求更改 int 的符号,因此无需担心负零或其他概念,我建议 x = -x 更具表现力(请参阅下面的 EJP 答案)。 .
                • 先前评论的附录:另请参阅 Bohemian 的答案,因为它更详细地解释了一元运算符
                • @FailedDev 当然,但我说它更具表现力(不是更好的性能)
                • 这个答案不正确。 int 具有最小值 -2^31 和最大值 2^31-1 这意味着在特定情况下,当您需要转换 Integer.MIN_VALUE 这将不起作用并且也不会引发异常(我认为真的很糟糕)
                猜你喜欢
                • 1970-01-01
                • 2014-03-20
                • 2014-11-13
                • 2015-06-14
                • 2022-01-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多