^
Java では (キャレット) 演算子はどのような機能を果たしますか?
これを試すと:
int a = 5^n;
...それは私に次のことを与えます:
n = 5 の場合は 0 を返し、
n = 4 の場合は 1 を返し、
n = 6 の場合は 3 を返します。
...だから、累乗は実行されないと思います。しかし、それは何でしょうか?
ベストアンサー1
Javaの^演算子
^
Java では、排他的論理和 ("xor") 演算子です。
例を見てみましょう5^6
:
(decimal) (binary)
5 = 101
6 = 110
------------------ xor
3 = 011
これはビット単位の真理値表です(JLS15.22.1) と論理 (JLS15.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 の累乗を計算することもできます。つまり、は の2 のk(1L << k)
乗です。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