^运算符在Java中做什么?

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

当我尝试这样做时:

int a = 5^n;

...它给我:

当n = 5时,

返回0
当n = 4时,返回1
当n = 6时,返回3

...所以我猜它不会取幂。但那是什么呢?

441840 次浏览

它是XOR位操作符。

它是逐位异或,Java没有求幂运算符,你必须使用Math.pow()来代替。

正如其他人所说,这是按位异或。如果你想将一个数字提升到给定的幂,使用Math.pow(a , b),其中a是一个数字,b是幂。

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

AraK的链接指向了异或的定义,它解释了这个函数如何对两个布尔值工作。

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

用你的例子:

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

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

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

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

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

在这里

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

它是java中的位xor运算符,当不同值时结果为1(即1 ^ 0 = 1),当相同值时结果为0(即0 ^ 0 = 0)。

Java中的^运算符

^在Java中是异或(“xor”)操作符。

让我们以5^6为例:

(decimal)    (binary)
5     =  101
6     =  110
------------------ xor
3     =  011

这是位xor (JLS 15.22.1)和逻辑xor (JLS 15.22.2)的真值表:

^ | 0 1      ^ | F T
--+-----     --+-----
0 | 0 1      F | F T
1 | 1 0      T | T F

更简单地说,你也可以将xor视为“this that, but 不是两个!”。

另请参阅


Java中的求幂

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

您还可以使用传统的位移动技巧来计算2的一些幂。也就是说,对于k=0..63(1L << k)等于2的__abc2次方。

另请参阅


< em >合并注意< / em >:这个答案是从另一个问题合并而来的,该问题的目的是使用幂运算将字符串"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

这是因为使用了异或运算符。

在java或其他语言中,^是位xor, 当然,

10 ^ 1 = 11。 关于逐位操作符的更多信息 < / p >

有趣的是,Java和c#没有强大的操作符。

在Python等其他语言中,您可以执行10**2=100,尝试一下。

^是二进制(以2为底)异或,而不是取幂(不能作为Java运算符)。关于取幂,请参见java.lang.Math.pow()。

它是java中的位异或运算符,当一个数字以二进制形式写成时,它的结果是1表示不同的位值(即1 ^ 0 = 1),0表示相同的位值(即0 ^ 0 = 0)。

例:-

用你的例子:

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

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

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

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

  • 对布尔数组中的所有元素进行XORing会告诉你数组中是否有奇数个真元素
  • 如果你有一个数组,所有数字都重复偶数次,只有一个数字重复奇数次,你可以通过XORing所有元素找到它。
  • 不使用临时变量交换值
  • 寻找在1到n范围内缺失的数字
  • 对通过网络发送的数据进行基本验证。

很多这样的技巧可以使用比特明智的操作符,有趣的话题来探索。

异或运算符。它用于对数字进行位运算。它有这样的行为,当你对相同的位做异或操作,比如0 xor 0 / 1 xor 1,结果是0。但如果任何位不一样,结果就是1。 所以当你计算5^3时,你可以看这些数字5和6的二进制形式,因此表达式变成(101)XOR(110),它给出的结果(011)的十进制表示是3。

异或运算符规则=>

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执行异或操作:

     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

异或运算符规则

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

位运算符对位进行操作,并执行逐位操作。假设a = 60, b = 13;现在,在二进制格式中,它们将如下所示

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

^ =(位异或)

描述

如果二进制异或操作符在一个操作数中设置,则复制位。

例子

(A ^ B)会给出49,即0011 0001

作为其他答案的补充,值得一提的是,插入操作符也可以与布尔操作数一起使用,它返回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