312

^(caret) 运算符在 Java中的作用是什么?

当我尝试这个时:

int a = 5^n;

...它给了我:

对于 n = 5,返回 0
对于 n = 4,返回 1
对于 n = 6,返回 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 的某些幂。也就是说,(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
于 2010-04-20T02:46:46.160 回答
150

正如许多人已经指出的那样,它是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.

这里

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

于 2010-01-02T11:59:11.150 回答
35

它是按位异或,Java 没有指数运算符,您必须使用它Math.pow()

于 2010-01-02T11:45:56.943 回答
23

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
于 2017-11-04T02:32:35.277 回答
18

它是XOR按位运算符。

于 2010-01-02T11:45:47.950 回答
16

很多人已经解释了它是什么以及如何使用它,但是除了显而易见的之外,您还可以使用这个运算符来做很多编程技巧,比如

  • 对布尔数组中的所有元素进行异或运算会告诉您该数组是否具有奇数个真实元素
  • 如果您有一个数组,其中所有数字都重复偶数次,除了一个重复奇数次的数组,您可以通过对所有元素进行异或运算来找到它。
  • 在不使用临时变量的情况下交换值
  • 查找 1 到 n 范围内的缺失数字
  • 通过网络发送的数据的基本验证。

很多这样的技巧可以使用位运算符来完成,这是一个值得探索的有趣话题。

于 2015-07-28T10:06:57.380 回答
15

XOR 运算符规则

0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1

位运算符对位起作用并执行逐位操作。假设 a = 60 且 b = 13;现在以二进制格式,它们将如下 -</p>

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
于 2018-12-25T06:06:26.330 回答
14

正如其他人所说,它是按位异或。如果您想将数字提高到给定的幂,请使用Math.pow(a , b),其中a是数字,b是幂。

于 2010-01-02T11:46:38.097 回答
8

AraK 的链接指向异或的定义,它解释了此函数如何处理两个布尔值。

缺少的信息是这如何应用于两个整数(或整数类型值)。按位异或应用于两个数字中对应的二进制数字对,并将结果重新组合成整数结果。

要使用您的示例:

  • 5的二进制表示是0101。
  • 4的二进制表示是0100。

定义按位异或的一种简单方法是说结果在两个输入数字不同的每个地方都有一个 1。

4和5,唯一的区别是在最后一位;所以

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

于 2010-01-02T11:51:22.057 回答
7

当数字以二进制形式写入时,它是 java 中的按位异或运算符,对于不同的位值(即 1 ^ 0 = 1)和相同的位值(即 0 ^ 0 = 0)结果为 0。

前任 :-

要使用您的示例:

5的二进制表示是0101。4的二进制表示是0100。

定义按位异或的一种简单方法是说结果在两个输入数字不同的每个地方都有一个 1。

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

于 2015-04-14T07:15:20.633 回答
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 回答
6

正如其他答案已经说明的那样,它是“异或”(XOR)运算符。有关 Java 中位运算符的更多信息,请参见:http: //java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html

于 2010-01-02T11:48:04.790 回答
6

那是因为您使用的是 xor 运算符。

在 java 或任何其他语言中,^ 是按位异或,所以当然,

10 ^ 1 = 11. 有关按位运算符的更多信息

有趣的是,Java 和 C# 没有幂运算符。

于 2010-04-20T02:48:11.333 回答
3

它是 java 中的按位异或运算符,对于不同的值(即 1 ^ 0 = 1)产生 1,对于相同的值(即 0 ^ 0 = 0)产生 0。

于 2010-01-02T14:19:40.603 回答
2

^ 是二进制(如 base-2)xor,而不是求幂(不能用作 Java 运算符)。有关求幂,请参见 java.lang.Math.pow()。

于 2010-04-20T02:57:02.960 回答
2

它是 XOR 运算符。它用于对数字进行位运算。它具有这样的行为,即当您对相同的位执行异或运算时说 0 XOR 0 / 1 XOR 1 结果为 0。但如果任何位不同,则结果为 1。所以当您执行 5^3 时,您可以以二进制形式查看这些数字 5、6,因此表达式变为 (101) XOR (110),其结果为 (011),其十进制表示为 3。

于 2017-07-21T03:46:14.997 回答
1

作为其他答案的补充,值得一提的是插入符运算符也可以与布尔操作数一起使用,并且它返回 true(当且仅当)操作数不同:

    System.out.println(true ^ true); // false
    System.out.println(true ^ false); // true
    System.out.println(false ^ false); // false
    System.out.println(false ^ true); // true
于 2021-09-18T17:57:41.263 回答
0

在 Python 等其他语言中你可以做到 10**2=100,试试吧。

于 2010-04-20T02:56:01.330 回答
-1

^ = (按位异或)

描述

如果二进制 XOR 运算符在一个操作数而不是两个操作数中设置,则复制该位。

例子

(A ^ B) 将给出 49 即 0011 0001

于 2020-12-31T09:18:54.960 回答