web-dev-qa-db-ja.com

Javaで^演算子は何をするのですか?

^(キャレット)演算子はJavaでどんな機能を果たしますか?

私がこれを試したとき:

int a = 5^n;

...それは私に与えます:

n = 5の場合、0を返します
n = 4の場合、1を返します
n = 6の場合、3を返します

...だから私はそれがべき乗を実行しないと思います。しかし、それは何ですか?

264
joroj

Javaの^演算子

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でのべき乗

整数のべき乗に関しては、残念ながらJavaにはそのような演算子がありません。 double Math.pow(double, double) を使うことができます(必要ならば結果をintにキャストします)。

2のべき乗を計算するために、伝統的なビットシフトトリックを使うこともできます。つまり、(1L << k)k=0..63の2のk乗です。

また見なさい


マージノート:この答えは、"8675309"をasを使わずにInteger.parseIntintに変換するためにべき乗を使うことを意図した別の質問からマージされましたプログラミング演習(^はこれからのべき乗を意味します)。 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
394

すでに指摘したように、それは 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.

こちらから こちら

これらの演算子は、個々のビットをフラグとして解釈する必要がある場合に整数を読み書きする必要がある場合、または整数内の特定の範囲のビットに特別な意味があり、それらだけを抽出する場合に役立ちます。これらの演算子を使用しなくても毎日のようなプログラミングを行うことができますが、ビットレベルでデータを処理しなければならない場合は、これらの演算子に関する十分な知識が非常に役立ちます。

142
Mark Byers

ビット単位のXORです。Javaにはべき乗演算子がありません。代わりにMath.pow()を使用する必要があります。

32
Dan Dyer

これは XOR のビット演算子です。

17
AraK

他の人が言っているように、それは少しXORです。与えられたべき乗の数を累乗したい場合は、 Math.pow(a , b) を使用します。ここで、aは数値、bはべき乗です。

14
Jon Skeet

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
14
Sachin Ambalkar

多くの人々がそれが何であるか、そしてそれがどのように使われることができるかについてすでに説明しました、しかし明らかなことを除けばあなたはこのようなプログラミングトリックの多くをするためにこの演算子を使うことができ

  • ブール配列のすべての要素をXORすると、その配列に奇数個の真の要素があるかどうかがわかります。
  • 奇数回繰り返すものを除いて、すべての数が偶数回繰り返される配列がある場合は、すべての要素をXORすることでそれを見つけることができます。
  • 一時変数を使用せずに値を交換する
  • 1からnの範囲で欠けている数を見つける
  • ネットワーク経由で送信されたデータの基本的な検証。

多くのそのようなトリックは、ビットワイズ演算子を使って行うことができます。

13
willsteel

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).

7
Nikhil Kumar
7
Luis

他の答えで既に述べたように、それは "排他的論理和"(XOR)演算子 です。 Javaのビット演算子についての詳細は、 http://Java.Sun.com/docs/books/tutorial/Java/nutsandbolts/op3.html を参照してください。

7
Bart Kiers

AraKのリンクは、この関数が2つのブール値に対してどのように機能するかを説明する、排他的論理和の定義を指しています。

欠けている情報は、これが2つの整数(または整数型の値)にどのように適用されるかです。ビットごとの排他的論理和は、2つの数値で対応する2進数のペアに適用され、結果は整数の結果に再組み立てされます。

あなたの例を使用するには:

  • 5の2進数表現は0101です。
  • 4の2進数表現は0100です。

ビットごとのXORを定義する簡単な方法は、2つの入力数が異なるすべての場所で結果が1になることを言うことです。

4と5では、唯一の違いは最後の場所にあります。そう

0101 ^ 0100 = 0001(5 ^ 4 = 1).

7
Carl Smotricz

それはあなたがxor演算子を使っているからです。

Javaや他の言語では、^はビットごとのxorです。もちろん、

10 ^ 1 = 11 ビット演算子についての詳細

JavaとC#にパワー演算子がないのは興味深いことです。

6
jcao219

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
4
Mayur Dabhi

Javaではビットごとのxor演算子で、異なる値の場合1、つまり同じ値の場合0、つまり0 ^ 0 = 0となります。

2
GuruKulki

それはXOR演算子です。それは数にビット操作をするのに使用されます。同じビットに対してxor演算を実行すると、0 XOR 0/1 XOR 1と言う結果が0になります。したがって、5 ^ 3を実行すると、これらの数5、6をバイナリ形式で見ることができるので、式は(101)XOR(110)となり、結果は(011) 10進表記は3です。

2
Yug Singh

^は2進数(基数2のように)xorであり、べき乗ではありません(これはJava演算子としては使用できません)。べき乗については、Java.lang.Math.pow()を参照してください。

2
Ming-Tang

Pythonのような他の言語では10 ** 2 = 100ができますので試してください。

0
mkotechno