一尘不染

Javs ^运算符在Java中做什么?

java

^(插入符)运算符在Java中提供什么功能?

当我尝试这个:

int a = 5^n;

…它给我:

for n = 5, returns 0 for n = 4, returns 1 for n = 6, returns 3

…所以我猜它不执行幂运算。但是那是什么呢?


阅读 495

收藏
2020-02-28

共1个答案

一尘不染

Java中的^运算子
^ 在Java中,“异或”运算符。

让我们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视为“ this or that,但不是两者都!”。

Exponentiation in Java

至于整数幂运算,不幸的是Java没有这样的运算符。你可以使用double Math.pow(double, double)(int如果需要,将结果广播到)。

你还可以使用传统的移位技巧来计算2的幂。也就是说,(1L << k)对于的第k次幂是2 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;该答案的下一部分将解决此任务不需要求幂的问题。

Horner’s scheme

满足你的特定需求,你实际上不需要计算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
2020-02-28