^
(caret) 运算符在 Java中的作用是什么?
当我尝试这个时:
int a = 5^n;
...它给了我:
对于 n = 5,返回 0
对于 n = 4,返回 1
对于 n = 6,返回 3
...所以我猜它不执行幂运算。但那是什么?
^
(caret) 运算符在 Java中的作用是什么?
当我尝试这个时:
int a = 5^n;
...它给了我:
对于 n = 5,返回 0
对于 n = 4,返回 1
对于 n = 6,返回 3
...所以我猜它不执行幂运算。但那是什么?
^
在 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 没有这样的运算符。您可以使用(如有必要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
正如许多人已经指出的那样,它是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 没有指数运算符,您必须使用它Math.pow()
。
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
它是XOR
按位运算符。
很多人已经解释了它是什么以及如何使用它,但是除了显而易见的之外,您还可以使用这个运算符来做很多编程技巧,比如
很多这样的技巧可以使用位运算符来完成,这是一个值得探索的有趣话题。
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
正如其他人所说,它是按位异或。如果您想将数字提高到给定的幂,请使用Math.pow(a , b)
,其中a
是数字,b
是幂。
AraK 的链接指向异或的定义,它解释了此函数如何处理两个布尔值。
缺少的信息是这如何应用于两个整数(或整数类型值)。按位异或应用于两个数字中对应的二进制数字对,并将结果重新组合成整数结果。
要使用您的示例:
定义按位异或的一种简单方法是说结果在两个输入数字不同的每个地方都有一个 1。
4和5,唯一的区别是在最后一位;所以
0101 ^ 0100 = 0001 (5 ^ 4 = 1) 。
当数字以二进制形式写入时,它是 java 中的按位异或运算符,对于不同的位值(即 1 ^ 0 = 1)和相同的位值(即 0 ^ 0 = 0)结果为 0。
前任 :-
要使用您的示例:
5的二进制表示是0101。4的二进制表示是0100。
定义按位异或的一种简单方法是说结果在两个输入数字不同的每个地方都有一个 1。
0101 ^ 0100 = 0001 (5 ^ 4 = 1) 。
要执行求幂,您可以改用 Math.pow:
https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Math.html#pow%28double,%20double%29
正如其他答案已经说明的那样,它是“异或”(XOR)运算符。有关 Java 中位运算符的更多信息,请参见:http: //java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html
它是 java 中的按位异或运算符,对于不同的值(即 1 ^ 0 = 1)产生 1,对于相同的值(即 0 ^ 0 = 0)产生 0。
^ 是二进制(如 base-2)xor,而不是求幂(不能用作 Java 运算符)。有关求幂,请参见 java.lang.Math.pow()。
它是 XOR 运算符。它用于对数字进行位运算。它具有这样的行为,即当您对相同的位执行异或运算时说 0 XOR 0 / 1 XOR 1 结果为 0。但如果任何位不同,则结果为 1。所以当您执行 5^3 时,您可以以二进制形式查看这些数字 5、6,因此表达式变为 (101) XOR (110),其结果为 (011),其十进制表示为 3。
作为其他答案的补充,值得一提的是插入符运算符也可以与布尔操作数一起使用,并且它返回 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
在 Python 等其他语言中你可以做到 10**2=100,试试吧。
^ = (按位异或)
描述
如果二进制 XOR 运算符在一个操作数而不是两个操作数中设置,则复制该位。
例子
(A ^ B) 将给出 49 即 0011 0001