^运算符在Java中做什么?

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

当我尝试这个:

 int a = 5^n; 

它给了我:

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

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

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 ^ | FT --+----- --+----- 0 | 0 1 F | FT 1 | 1 0 T | TF 

更简单地说,你也可以把xor想成“这个那个,但不是两个 !”。

也可以看看

  • 维基百科:独占或

Java中的求幂

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

你也可以使用传统的位移技巧来计算两个幂。 也就是说,对于k=0..63(1L << k)是2的k次方。

也可以看看

  • 维基百科:算术转换

合并注意 :这个答案是从另一个问题合并,其目的是使用指数将字符串"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 

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

从这里 。

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

这是按位XOR,Java没有指数运算符,您将不得不使用Math.pow()来代替。

这是XOR按位运算符。

正如其他人所说,这是按位XOR。 如果你想提高一个数字给定的权力,使用Math.pow(a , b) ,其中a是一个数字和b是权力。

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

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

很多这样的技巧都可以使用位明智的操作员来完成,有趣的话题去探索。

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

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

使用你的例子:

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

定义按位XOR的简单方法是在两个输入数字不同的每个地方都有一个1。

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

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

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

例如: –

使用你的例子:

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

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

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

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

那是因为你正在使用xor操作符。

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

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

Java和C#没有电力运营商很有意思。

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

^是二进制的(如在base-2中)xor,不是指数运算(它不作为Java运算符可用)。 为了求幂,请参阅java.lang.Math.pow()。

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

这是XOR操作符。 对数字进行位操作是有用的。 它具有这样的行为,当你做一个异或运算在相同的比特说0 XOR 0/1异或1的结果是0.但是,如果任何位是不同的,那么结果是1.所以当你做了5 ^ 3然后你可以看它们的二进制形式的这些数字5,6,因此该表达式变成(101)XOR(110),其给出十进制表示为3的结果(011)。

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 

同时,在Groovy中:

 def x = 89 def y = 92 print "x ^ y = ${x ^ y}\n" print "x ** y = ${x ** y}\n" print "Math.pow(x,y) = ${Math.pow(x,y)}\n" 

使用groovyShell运行上面的例子给出:

 x ^ y = 5 x ** y = 220739783027264538664507899981652263884030030210130685655986852988723754592147271358302675499604456885393671329478799379899078505327879299542726514661188445083298962617396644428321 Math.pow(x,y) = 2.2073978302726454E179