^ 运算符在 Java 中有什么作用?

2022-08-31 05:01:22

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

当我尝试这个:

int a = 5^n;

...它给了我:

对于 n = 5,对于 n = 4 返回 0
,对于 n = 6 返回 1
,返回 3

...所以我想它不会执行幂。但它是什么呢?


答案 1

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想象成“这个那个,但不是两者兼而有之

另请参见


Java 中的幂

至于整数幂,不幸的是Java没有这样的运算符。您可以使用双精度 Math.pow(双精度,双精度)(如有必要,将结果转换为)。int

您还可以使用传统的位移技巧来计算一些二的幂。即,是 2 的 k 次幂。(1L << k)k=0..63

另请参见


合并说明:这个答案是从另一个问题合并而来的,其中的目的是使用幂将字符串转换为不使用编程练习(表示从现在开始的幂)。OP的意图是计算;本答案的下一部分解决了幂对于此任务不是必需的。"8675309"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

答案 2

正如许多人已经指出的那样,它是XOR运算符。许多人也已经指出,如果你想要幂,那么你需要使用Math.pow

但我认为同样需要注意的是,这只是一系列统称为按位运算符的运算符之一:^

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.

从这里

当您需要读取和写入整数时,这些运算符可能会派上用场,其中各个位应被解释为标志,或者当整数中的特定范围的位具有特殊含义并且您只想提取这些位时。您可以每天进行大量编程,而无需使用这些运算符,但是如果您必须在位级别处理数据,那么对这些运算符的良好了解是无价的。