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

时间:2010-01-02 11:44:48

标签: java operators exponentiation

^(插入符号)运算符在Java中用什么函数?

当我尝试这个时:

int a = 5^n;

......它给了我:

  

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

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

18 个答案:

答案 0 :(得分:391)

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中的Exponentiation

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

您还可以使用传统的位移技巧来计算两个幂。也就是说,(1L << k)k=0..63 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的各种幂。您可以使用所谓的Horner's scheme,这不仅简单而且高效。

由于您是将此作为个人练习,我不会提供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

答案 1 :(得分:142)

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

来自here

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

答案 2 :(得分:32)

它是按位XOR,Java没有取幂运算符,您必须使用Math.pow()代替。

答案 3 :(得分:17)

它是XOR按位运算符。

答案 4 :(得分:14)

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

答案 5 :(得分:13)

XOR运算符规则=&gt;

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

答案 6 :(得分:13)

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

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

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

答案 7 :(得分:7)

正如其他答案所述,它是"exclusive or" (XOR) operator。有关Java中位运算符的更多信息,请参阅:http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html

答案 8 :(得分:7)

AraK的链接指向exclusive-or的定义,它解释了此函数如何适用于两个布尔值。

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

使用您的示例:

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

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

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

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

答案 9 :(得分:7)

答案 10 :(得分:7)

它是java中的Bitwise xor运算符,当一个数字以二进制形式写入时,对于不同的位值(即1 ^ 0 = 1)得到1,对于相同的位值(即0 ^ 0 = 0)得到0

前: -

使用您的示例:

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

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

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

答案 11 :(得分:6)

那是因为你正在使用xor运算符。

在java中,或者几乎任何其他语言,^是按位xor, 当然,

10 ^ 1 = 11。 more info about bitwise operators

有趣的是Java和C#没有电源操作符。

答案 12 :(得分:3)

XOR运算符规则

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

答案 13 :(得分:2)

^是二进制的(如在base-2中)xor,而不是取幂(它不能作为Java运算符使用)。对于取幂,请参阅java.lang.Math.pow()。

答案 14 :(得分:2)

是XOR运算符。它用于对数字进行位操作。它具有这样的行为:当你对相同的位执行xor运算时,说0 XOR 0/1 XOR 1,结果为0.但是如果任何位不同,则结果为1。 所以当你做5 ^ 3然后你可以用它们的二进制形式查看这些数字5,6,因此表达式变为(101)XOR(110),它给出了十进制表示为3的结果(011)。

答案 15 :(得分:2)

它是java中的按位xor运算符,其中1表示不同的值(即1 ^ 0 = 1),0表示相同的值(即0 ^ 0 = 0)。

答案 16 :(得分:0)

在像Python这样的其他语言中你可以做10 ** 2 = 100,试试吧。

答案 17 :(得分:-1)

^ = (按位异或)

说明

<块引用>

二进制 XOR 运算符复制该位,如果它在一个操作数中被设置,但不能同时在两个操作数中设置。

示例

<块引用>

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