^
(caret)演算子はJavaでどのような機能を果たしますか?
私がこれを試すとき:
int a = 5^n;
...それは私に与えます:
n = 5の場合、n = 4の場合は0を返し 、n = 6の場合
は1を返し、3を返します。
...したがって、べき乗は実行されないと思います。しかし、それは何ですか?
^
(caret)演算子はJavaでどのような機能を果たしますか?
私がこれを試すとき:
int a = 5^n;
...それは私に与えます:
n = 5の場合、n = 4の場合は0を返し 、n = 6の場合
は1を返し、3を返します。
...したがって、べき乗は実行されないと思います。しかし、それは何ですか?
^
Javaでは、排他的論理和( "xor")演算子です。
例として見てみましょう5^6
:
(decimal) (binary)
5 = 101
6 = 110
------------------ xor
3 = 011
これは、ビット単位( JLS 15.22.1)および論理(JLS 15.22.2)xorの真理値表です。
^ | 0 1 ^ | F T
--+----- --+-----
0 | 0 1 F | F T
1 | 1 0 T | T F
もっと簡単に言えば、xorを「これまたはあれですが、両方ではありません!」と考えることもできます。
整数のべき乗に関しては、残念ながらJavaにはそのような演算子がありません。使用できますdouble Math.pow(double, double)
(必要に応じて結果をにキャストしint
ます)。
従来のビットシフトトリックを使用して、2の累乗を計算することもできます。つまり、はのk乗(1L << k)
の2倍です。k=0..63
マージノート:この回答は、プログラミング演習として使用せず
"8675309"
を変換するためにべき乗を使用することを目的とした別の質問からこれからのべき乗を示します)。OPの意図は計算すること; この回答の次の部分では、このタスクにべき乗は必要ないことを説明しています。int
Integer.parseInt
^
8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309
特定のニーズに対応するために、実際には10のさまざまな累乗を計算する必要はありません。単純であるだけでなく効率的なホーナースキームと呼ばれるものを使用できます。
これは個人的な演習として行っているので、Javaコードは提供しませんが、主なアイデアは次のとおりです。
8675309 = 8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0
= (((((8*10 + 6)*10 + 7)*10 + 5)*10 + 3)*10 + 0)*10 + 9
最初は複雑に見えるかもしれませんが、実際はそうではありません。基本的に左から右の数字を読み、次の数字を追加する前に、これまでの結果に10を掛けます。
表形式:
step result digit result*10+digit
1 init=0 8 8
2 8 6 86
3 86 7 867
4 867 5 8675
5 8675 3 86753
6 86753 0 867530
7 867530 9 8675309=final
多くの人がすでに指摘しているように、それはXOR演算子です。多くの人は、累乗が必要な場合はMath.powを使用する必要があることもすでに指摘しています。
^
しかし、ビット演算子としてまとめて知られている演算子のファミリの 1 つにすぎないことに注意することも役立つと思います。
Operator Name Example Result Description
a & b and 3 & 5 1 1 if both bits are 1.
a | b or 3 | 5 7 1 if either bit is 1.
a ^ b xor 3 ^ 5 6 1 if both bits are different.
~a not ~3 -4 Inverts the bits.
n << p left shift 3 << 2 12 Shifts the bits of n left p positions. Zero bits are shifted into the low-order positions.
n >> p right shift 5 >> 2 1 Shifts the bits of n right p positions. If n is a 2's complement signed number, the sign bit is shifted into the high-order positions.
n >>> p right shift -4 >>> 28 15 Shifts the bits of n right p positions. Zeros are shifted into the high-order positions.
ここから。
これらの演算子は、個々のビットをフラグとして解釈する必要がある整数を読み書きする必要がある場合、または整数の特定の範囲のビットに特別な意味があり、それらのみを抽出したい場合に便利です。これらの演算子を使用しなくても、毎日のプログラミングの多くを行うことができますが、ビット レベルでデータを操作する必要がある場合は、これらの演算子に関する十分な知識が非常に重要です。
これはビット単位の XOR です。Java には指数演算子がありませんMath.pow()
。代わりに使用する必要があります。
XOR
ビット演算子です。
他の人が言ったように、それはビット単位の XOR です。数値を特定の累乗にしたい場合は、 を使用しますMath.pow(a , b)
。ここa
で、 は数値で、b
は累乗です。
AraK のリンクは、この関数が 2 つのブール値に対してどのように機能するかを説明する排他的論理和の定義を指しています。
不足している情報は、これが 2 つの整数 (または整数型の値) にどのように適用されるかです。ビット単位の排他的論理和は、2 つの数値の対応する 2 進数のペアに適用され、結果は整数の結果に再構築されます。
あなたの例を使用するには:
ビット単位の XOR を定義する簡単な方法は、2 つの入力数値が異なるすべての場所で結果が 1 になるということです。
4 と 5 の違いは最後の桁だけです。それで
0101 ^ 0100 = 0001 (5 ^ 4 = 1) .
べき乗を実行するには、代わりにMath.powを使用できます。
https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Math.html#pow%28double,%20double%29
これは Java のビット単位の xor 演算子であり、数値がバイナリ形式で書き込まれるときに、ビットの異なる値 (つまり 1 ^ 0 = 1) に対して 1 を返し、ビットの同じ値 (つまり 0 ^ 0 = 0) に対して 0 を返します。
元 :-
あなたの例を使用するには:
5 のバイナリ表現は 0101 です。4 のバイナリ表現は 0100 です。
Bitwise XOR を定義する簡単な方法は、2 つの入力数値が異なるすべての場所で結果が 1 になると言うことです。
0101 ^ 0100 = 0001 (5 ^ 4 = 1) .
これは、xor演算子を使用しているためです。
Java、または他のほぼすべての言語では、^はビット単位のxorなので、もちろん、
10 ^ 1=11. ビット演算子に関する詳細情報
JavaとC#にパワー演算子がないのは興味深いことです。
他の回答で既に述べたように、それは「排他的論理和」(XOR) 演算子です。Java のビット演算子の詳細については、http: //java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.htmlを参照してください。
これは、異なる値 (つまり 1 ^ 0 = 1) に対して 1 を返し、同じ値 (つまり 0 ^ 0 = 0) に対して 0 を返す Java のビット単位の xor 演算子です。
^はバイナリ(基数2のように)xorであり、べき乗ではありません(Java演算子としては使用できません)。べき乗については、java.lang.Math.pow()を参照してください。
Pythonのような他の言語では、10 ** 2=100を実行できます。試してみてください。
^ = (ビット単位の XOR)
説明
バイナリ XOR 演算子は、両方ではなく一方のオペランドに設定されている場合、ビットをコピーします。
例
(A ^ B) は 0011 0001 である 49 を返します