^
(插入符号)运算符在Java中用什么函数?
当我尝试这个时:
int a = 5^n;
......它给了我:
对于n = 5,返回0
对于n = 4,返回1
对于n = 6,返回3
...所以我猜它不会执行取幂。但那又是什么呢?
答案 0 :(得分:391)
^
是独占或(“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
。
您还可以使用传统的位移技巧来计算两个幂。也就是说,(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)
许多人已经解释过它是什么以及它是如何使用的,但除了明显的你可以使用这个操作符来做很多编程技巧,如
很多这样的技巧可以使用比特运算符来完成,这是一个值得研究的有趣话题。
答案 7 :(得分:7)
正如其他答案所述,它是"exclusive or" (XOR) operator。有关Java中位运算符的更多信息,请参阅:http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html
答案 8 :(得分:7)
AraK的链接指向exclusive-or的定义,它解释了此函数如何适用于两个布尔值。
缺少的信息是如何应用于两个整数(或整数类型值)。按位异或 - 应用于两个对应的二进制数字对,并将结果重新组合成整数结果。
使用您的示例:
定义按位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