2010-03-16 44 views
71

我碰到了^操作符在python今天跑去尝试它,我得到了以下的输出:Python中的插入符号运算符(^)在做什么?

>>> 8^3 
11 
>>> 8^4 
12 
>>> 8^1 
9 
>>> 8^0 
8 
>>> 7^1 
6 
>>> 7^2 
5 
>>> 7^7 
0 
>>> 7^8 
15 
>>> 9^1 
8 
>>> 16^1 
17 
>>> 15^1 
14 
>>> 

这似乎是基于8,所以我猜某种字节操作的?我似乎无法找到关于这个搜索网站的很多内容,除了它对于浮动的表现奇怪之外,是否有人链接到这个操作员所做的或者你能在这里解释它?

+3

对于整数,它确实C.^_- – 2010-03-16 00:52:41

+8

仅供参考,从Python外壳,您可以用'帮助同样的事情( '^')' – seth 2010-03-16 01:00:40

+1

-1:这是完全覆盖了Python文档中和包含的帮助功能。在这里提出这个问题很愚蠢。 – 2010-03-16 01:44:48

回答

109

这是一个按位XOR(“异或”)。

它的结果为true,如果操作数一个(也是唯一一个)(计算结果为)真。

为了证明:

>>> 0^0 
0 
>>> 1^1 
0 
>>> 1^0 
1 
>>> 0^1 
1 

来解释自己的一个例子:

>>> 8^3 
11 

想想这样说:

 
1000 # 8 (binary) 
0011 # 3 (binary) 
---- # APPLY XOR ('vertically') 
1011 # result = 11 (binary) 
+10

一个稍微说明性的例子没有Python文档中可能包括有'1'两个号码同一位以清楚表明'1 xor 1 = 0'。 – 2010-03-16 02:36:11

+1

我想补充一点,你可以通过键入'0bX'来做二进制数字,其中X是你的二进制数。 '0b0001','0b0010'等。因此,'0b1101^0b1110'会给你'0b0011'(或3)。 – Jeff 2015-07-28 23:58:45

+0

我想“如果一个(且只有一个)操作数(计算结果为)为真,结果为真。”是不是精确的,那么在整数运算之外,布尔型xor – 2015-09-05 17:02:21

37

它调用的__xor__()__rxor__()方法该对象根据需要对整数类型进行逐位异或。

+3

+1的定义将指出它*真正*做了什么。 – 2010-03-16 03:36:22

7

一般而言,符号^__xor____rxor__方法的infix版本。无论数据类型放置在符号的左侧还是右侧,都必须以兼容的方式实现此功能。对于整数,这是常见的XOR操作,但例如没有为float类型的功能与int类型内置的定义:

In [12]: 3^4 
Out[12]: 7 

In [13]: 3.3^4 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-13-858cc886783d> in <module>() 
----> 1 3.3^4 

TypeError: unsupported operand type(s) for ^: 'float' and 'int' 

关于Python的一个妙处是,你可以覆盖这个行为在你自己的一类中。例如,在某些语言中,符号意味着取幂。你可以做的是这样,就像一个例子:对于Foo仅实例

class Foo(float): 
    def __xor__(self, other): 
     return self ** other 

那么这样的事情会的工作,而现在,^符号将意味着幂。

In [16]: x = Foo(3) 

In [17]: x 
Out[17]: 3.0 

In [18]: x^4 
Out[18]: 81.0 
+0

哇,那有可能吗?我们可能会改变'+'运算符的工作方式吗? – 2013-10-18 13:41:51

+0

是的,这是''''符号如何为数组类型执行另一种操作(数学加法)时为'list'(连接)执行的一种操作。在这种情况下,你可以重写你的类中的'__add__'或'__radd__'方法。 – ely 2013-10-18 13:43:54

+1

作为一个侧面说明,'__r * __'的这些版本(如'__rxor__'或'__radd__')将出现在中缀符号的*右侧*的参数调用,并且只有当调用左手符号的功能不起作用。你可以把它想象为'try:left_hand_symbol .__ xor __(right_hand_symbol);除了:right_hand_symbol .__ rxor __(left_hand_symbol)','但xor'可以通过任何可用的中缀运算符在〔Python的数据模型(http://docs.python.org/3.1/reference/datamodel.html更换?高亮= rlshift)。 – ely 2013-10-18 13:46:26