正の整数を負の整数に変換し、負の整数を正の整数に変換するJava関数はありますか?
この変換を実行するreverse
関数を探しています。
-5 -> 5
5 -> -5
x *= -1;
?このためのライブラリ関数が本当に必要ですか?
x = -x;
これはおそらく私が今まで見た中で最も些細な質問です。
...そして、この些細な関数を 'reverse()'と呼ぶ理由は別の謎です。
単項マイナス演算子を使用するだけです:
int x = 5;
...
x = -x; // Here's the mystery library function - the single character "-"
Javaにはtwoマイナス 演算子 があります:
0 - x
)、およびこれはコンパイルされ、期待どおりに動作します。
別の方法(2の補数):
public int reverse(int x){
x~=x;
x++;
return x;
}
最初に1の補数を実行し(すべてのビットを補う)、xに1を追加します。このメソッドも仕事をします。
注:このメソッドはJavaで記述されており、他の多くの言語に似ています。
オリジナル* = -1;
シンプルなコード行、オリジナルはあなたが望む任意の整数です。
そのような関数は存在しないか、書き込むことができません。
問題は、エッジの場合Integer.MIN_VALUE(-2,147,483,648 = 0x80000000)が上記の3つの方法のそれぞれを適用し、同じ値を取得することです。これは、整数の表現と、可能な最大の整数Integer.MAX_VALUE(-2,147,483,647 = 0x7fffffff)であり、これは-Integer.MIN_VALUEが1少ない必要があります。
ここでネクロマンシング。
明らかに、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);
}
}
そうすれば、平凡なプログラマーが何が起こっているのか理解できないようにすることができます;)
はい、すでに Jeffrey Bosboom (ごめんなさい、Jeffrey、答えたときにあなたのコメントに気付かなかった)で既に述べたように、そのような関数があります: Math.negateExact 。
そして
いいえ、おそらく使用しないでください。 メソッドリファレンス が必要な場合を除きます。
マイナス演算子またはMath.absを使用できます。これらは、Integer.MIN_VALUEを除くすべての負の整数で機能します! 0-MIN_VALUEを実行すると、答えはMIN_VALUEのままです。
数学を使用できます:
int x = Math.abs(-5);