312

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

私がこれを試すとき:

int a = 5^n;

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

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

...したがって、べき乗は実行されないと思います。しかし、それは何ですか?

4

19 に答える 19

433

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の累乗を計算することもできます。つまり、はのk乗(1L << k)の2倍です。k=0..63

も参照してください


マージノート:この回答は、プログラミング演習として使用せず"8675309"を変換するためにべき乗を使用することを目的とした別の質問からこれからのべき乗を示します)。OPの意図は計算すること; この回答の次の部分では、このタスクにべき乗は必要ないことを説明しています。intInteger.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
于 2010-04-20T02:46:46.160 に答える
150

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

ここから。

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

于 2010-01-02T11:59:11.150 に答える
35

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

于 2010-01-02T11:45:56.943 に答える
18

XORビット演算子です。

于 2010-01-02T11:45:47.950 に答える
14

他の人が言ったように、それはビット単位の XOR です。数値を特定の累乗にしたい場合は、 を使用しますMath.pow(a , b)。ここaで、 は数値で、bは累乗です。

于 2010-01-02T11:46:38.097 に答える
8

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

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

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

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

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

4 と 5 の違いは最後の桁だけです。それで

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

于 2010-01-02T11:51:22.057 に答える
7

べき乗を実行するには、代わりにMath.powを使用できます。

https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Math.html#pow%28double,%20double%29

于 2010-04-20T02:48:02.503 に答える
7

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

元 :-

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

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

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

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

于 2015-04-14T07:15:20.633 に答える
6

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

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

10 ^ 1=11. ビット演算子に関する詳細情報

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

于 2010-04-20T02:48:11.333 に答える
6

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

于 2010-01-02T11:48:04.790 に答える
3

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

于 2010-01-02T14:19:40.603 に答える
2

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

于 2010-04-20T02:57:02.960 に答える
0

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

于 2010-04-20T02:56:01.330 に答える
-1

^ = (ビット単位の XOR)

説明

バイナリ XOR 演算子は、両方ではなく一方のオペランドに設定されている場合、ビットをコピーします。

(A ^ B) は 0011 0001 である 49 を返します

于 2020-12-31T09:18:54.960 に答える