^
(キャレット)演算子はJavaでどんな機能を果たしますか?
私がこれを試したとき:
int a = 5^n;
...それは私に与えます:
n = 5の場合、0を返します
n = 4の場合、1を返します
n = 6の場合、3を返します
...だから私はそれがべき乗を実行しないと思います。しかし、それは何ですか?
Javaの^
は排他的論理和( "xor")演算子です。
例として5^6
を取りましょう。
(decimal) (binary)
5 = 101
6 = 110
------------------ xor
3 = 011
これはビット単位( JLS 15.22.1 )および論理値( JLS 15.22.2 )の真理値表です。
^ | 0 1 ^ | F T
--+----- --+-----
0 | 0 1 F | F T
1 | 1 0 T | T F
もっと単純に言えば、xorを「thisまたはのように考えることもできますが、両方ともではないのです」と考えることもできます。
整数のべき乗に関しては、残念ながらJavaにはそのような演算子がありません。 double Math.pow(double, double)
を使うことができます(必要ならば結果をint
にキャストします)。
2のべき乗を計算するために、伝統的なビットシフトトリックを使うこともできます。つまり、(1L << k)
はk=0..63
の2のk乗です。
マージノート:この答えは、
"8675309"
をasを使わずにInteger.parseInt
をint
に変換するためにべき乗を使うことを意図した別の質問からマージされましたプログラミング演習(^
はこれからのべき乗を意味します)。 OPの意図は8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309
を計算することでした。この答えの次の部分は、べき乗がこのタスクに必要ではないことに対処します。
固有のニーズに対処するために、実際にはさまざまな10のべき乗を計算する必要はありません。 Hornerのスキーム と呼ばれるものを使用できます。単純なだけでなく効率的です。
これは個人的な演習として行っているので、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
はべき乗です。
XOR演算子ルール=>
0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1
4、5、6のバイナリ表現
4 = 1 0 0
5 = 1 0 1
6 = 1 1 0
それでは、5と4でXOR操作を実行します。
5 ^ 4 => 1 0 1 (5)
1 0 0 (4)
----------
0 0 1 => 1
同様に
5 ^ 5 => 1 0 1 (5)
1 0 1 (5)
------------
0 0 0 => (0)
5 ^ 6 => 1 0 1 (5)
1 1 0 (6)
-----------
0 1 1 => 3
多くの人々がそれが何であるか、そしてそれがどのように使われることができるかについてすでに説明しました、しかし明らかなことを除けばあなたはこのようなプログラミングトリックの多くをするためにこの演算子を使うことができ
多くのそのようなトリックは、ビットワイズ演算子を使って行うことができます。
JavaのBitwise xor演算子は、数値がバイナリ形式で書き込まれるときに、異なるビット値(つまり1 ^ 0 = 1)に対して1、同じビット値(つまり0 ^ 0 = 0)に対して0になります。
例: -
あなたの例を使用するには:
5の2進数表現は0101です。4の2進数表現は0100です。
Bitwise XORを定義する簡単な方法は、2つの入力数が異なるすべての場所で結果が1になることを言うことです。
0101 ^ 0100 = 0001(5 ^ 4 = 1).
代わりにMath.powを使用してください。
http://Java.Sun.com/j2se/1.4.2/docs/api/Java/lang/Math.html#pow%28double,%20double%29
他の答えで既に述べたように、それは "排他的論理和"(XOR)演算子 です。 Javaのビット演算子についての詳細は、 http://Java.Sun.com/docs/books/tutorial/Java/nutsandbolts/op3.html を参照してください。
AraKのリンクは、この関数が2つのブール値に対してどのように機能するかを説明する、排他的論理和の定義を指しています。
欠けている情報は、これが2つの整数(または整数型の値)にどのように適用されるかです。ビットごとの排他的論理和は、2つの数値で対応する2進数のペアに適用され、結果は整数の結果に再組み立てされます。
あなたの例を使用するには:
ビットごとのXORを定義する簡単な方法は、2つの入力数が異なるすべての場所で結果が1になることを言うことです。
4と5では、唯一の違いは最後の場所にあります。そう
0101 ^ 0100 = 0001(5 ^ 4 = 1).
それはあなたがxor演算子を使っているからです。
Javaや他の言語では、^はビットごとのxorです。もちろん、
10 ^ 1 = 11 ビット演算子についての詳細
JavaとC#にパワー演算子がないのは興味深いことです。
XOR演算子ルール
0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1
ビット演算子はビットを処理し、ビットごとの演算を実行します。 a = 60かつb = 13であると仮定する。今バイナリ形式でそれらは次のようになります -
a = 0011 1100
b = 0000 1101
a^b ==> 0011 1100 (a)
0000 1101 (b)
------------- XOR
0011 0001 => 49
(a ^ b) will give 49 which is 0011 0001
Javaではビットごとのxor演算子で、異なる値の場合1、つまり同じ値の場合0、つまり0 ^ 0 = 0となります。
それはXOR演算子です。それは数にビット操作をするのに使用されます。同じビットに対してxor演算を実行すると、0 XOR 0/1 XOR 1と言う結果が0になります。したがって、5 ^ 3を実行すると、これらの数5、6をバイナリ形式で見ることができるので、式は(101)XOR(110)となり、結果は(011) 10進表記は3です。
^は2進数(基数2のように)xorであり、べき乗ではありません(これはJava演算子としては使用できません)。べき乗については、Java.lang.Math.pow()を参照してください。
Pythonのような他の言語では10 ** 2 = 100ができますので試してください。