^运算符在Java中做什么?


294

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

当我尝试这个:

int a = 5^n;

...它给我:

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

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


5
您可以张贴您正在使用的实际代码吗?
Anthony Forloney

我正在使用eclipse,它返回11。公共类SimpleParser {公共静态void main(String [] args){System.out.println((10 ^ 1)); }

2
在Java中,^运算符不是用于电源设置的。您将需要Math.pow代替。请参阅多基因润滑剂的答案。
Anthony Forloney

@WizardOfOdds:同意,这是一个好问题(^求幂?这只是常识!)。OP对Java语言的探索需要鼓励。
polygenelubricants 2010年

Answers:


419

Java中的^运算子

^ 在Java中,“异或”运算符。

让我们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视为“ this or that,但不是两者!”。

也可以看看


Java的幂运算

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

您还可以使用传统的移位技巧来计算2的幂。也就是说,(1L << k)对于的第k次幂是2 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的各种幂。您可以使用称为Horner的方案,该方案不仅简单而且有效。

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

16
只是为了添加此答案,OP正在寻找的功能可能是Math.pow(
10,1

146

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

这里

当您需要读写将单个位解释为标志的整数时,或者当整数中特定范围的位具有特殊含义并且您只想提取那些整数时,这些运算符会派上用场。您无需使用这些运算符就可以每天进行很多编程,但是如果您必须在位级别使用数据,那么对这些运算符的全面了解将是非常宝贵的。


34

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


20

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


15

很多人已经解释了它的含义以及如何使用它,但是除了显而易见的之外,您还可以使用此运算符来执行许多编程技巧,例如

  • 布尔数组中所有元素的XOR运算将告诉您数组中的真实元素是否为奇数
  • 如果您有一个数组,其中所有数字都重复偶数次,但一个数组重复奇数次,则可以通过对所有元素进行异或运算来发现。
  • 交换值而不使用临时变量
  • 查找范围在1到n之间的缺失数字
  • 通过网络发送的数据的基本验证。

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



13

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

8

AraK的链接指向“异或”的定义,该定义解释了此函数对两个布尔值的工作方式。

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

使用您的示例:

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

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

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

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




7

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

例如:

使用您的示例:

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

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

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



2

它是Java中的按位异或运算符,结果1表示不同的值(即1 ^ 0 = 1),结果0表示相同的值(即0 ^ 0 = 0)。


2

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


2

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.