^演算子はJavaで何をしますか?


294

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

私がこれを試すとき:

int a = 5^n;

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

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

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


5
使用している実際のコードを投稿できますか?
Anthony Forloney 2010

私はeclipseを使用していますが、これは11を返します。}}

2
Javaでは、^演算子はパワーセット用ではありません。Math.pow代わりに必要になります。polygenelubricantの回答を参照してください。
Anthony Forloney 2010

@WizardOfOdds:同意しました、これは良い質問です(^累乗のためですか?それは単なる常識です!)。OPによるJava言語の調査には励みになる必要があります。
polygenelubricants 2010

回答:


419

Javaの^演算子

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

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

従来のビットシフトトリックを使用して、2のべき乗を計算することもできます。つまり、の(1L << k)2のk乗ですk=0..63

こちらもご覧ください


マージノート:この回答は、指数関数を使用して文字列"8675309"をプログラミング演習としてint使用せずに文字列に変換することを意図した別の質問からマージさInteger.parseIntれました(^これから指数関数を示します)。OPの目的は、計算すること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

16
この答えに追加するために、OPが探している関数はおそらくMath.pow(
10、1

146

多くの人がすでに指摘したように、これは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.

ここから。

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


34

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


20

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


15

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

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

このようなトリックの多くは、ビットワイズ演算子を使用して実行できます。興味深いトピックです。



13

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

8

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

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

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

  • 5のバイナリ表現は0101です。
  • 4のバイナリ表現は0100です。

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

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

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




7

数値がバイナリ形式で書き込まれると、ビットの異なる値(つまり1 ^ 0 = 1)の結果は1になり、ビットの同じ値(つまり0 ^ 0 = 0)の結果は0になるJavaのビット単位のxor演算子です。

例:-

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

5のバイナリ表現は0101です。4のバイナリ表現は0100です。

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

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


6

これは、xor演算子を使用しているためです。

Java、または他のほぼすべての言語では、^はビット単位のxorなので、もちろん、

10 ^ 1 = 11. ビット演算子の詳細

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


2

これは、Javaのビット単位のxor演算子であり、異なる値(つまり1 ^ 0 = 1)の場合は1、同じ値(つまり0 ^ 0 = 0)の場合は0になります。


2

^は2進数(base-2と同様)であり、指数ではありません(Java演算子としては使用できません)。べき乗については、java.lang.Math.pow()を参照してください。


2

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.