Python’s in-place bitwise XOR operator x ^= y
calcualtes bitwise XOR x
and assigns the result to the first operand ^
yx
. To set this up for your own class, override the magic “dunder” method __ixor__(self, other)
in your class definition.
>>> x = 1 >>> x ^= 2 >>> x 3
The expression x
is syntactical sugar for the longer-form ^
= yx = x
:^
y
>>> x = 1 >>> x = x ^ 2 >>> x 3
Let’s dive into the bitwise XOR operator first—because if you’ve mastered bitwise XOR, understanding the in-place bitwise XOR operator is a breeze in the summer.
Bitwise XOR Refresher
Python’s bitwise XOR operator x ^ y
performs logical XOR on each bit position on the binary representations of integers x
and y
. Each output bit evaluates to 1 if and only if exactly one of the two input bits at the same position are 1. For example, the integer expression 4 ^ 3
is translated to the binary operation 0100 ^ 0011
which results in 0111
because for the last three positions exactly one bit is 1.
As you go over the article, you can watch my explainer video here:
In this example, you apply the bitwise XOR operator to two integers 32 and 16:
>>> 32 ^ 16 48
The expression 32 ^ 16
operates on the bit representations "0100000"
(decimal 32) and "0010000"
(decimal 16) and performs bitwise XOR resulting in binary "0110000"
(decimal 48):
First Operand x | 1 | 0 | 0 | 0 | 0 | 0 |
Second Operand y | 0 | 1 | 0 | 0 | 0 | 0 |
x ^ y | 1 | 1 | 0 | 0 | 0 | 0 |
Similarly, let’s have a look at a slightly modified example to showcase the bitwise XOR operator:
>>> 31 ^ 15 16
You can see this in the following visualization:
First Operand x | 1 | 1 | 1 | 1 | 1 |
Second Operand y | 0 | 1 | 1 | 1 | 1 |
x ^ y | 1 | 0 | 0 | 0 | 0 |
The decimal representation of the bit sequence "10000"
is 16.
Related Article: Python Bitwise XOR Operator Deep Dive
Python In-Place Bitwise XOR Magic Method
To use the in-place bitwise XOR operator ^=
on custom objects, define the __ixor__()
method (“dunder method”, “magic method”) that takes two arguments self
and other
, updates the first argument self
with the result of the operation, and returns the updated object.
In the following code, you calculate the result on two Data
objects:
class Data: def __init__(self, data): self.data = data def __ixor__(self, other): self.data ^= other.data return self x = Data(1) # b001 y = Data(3) # b011 x ^= y # b001 print(x.data) # 2
You can see that the content of the first operand is updated as a result of the in-place bitwise XOR operation.
Python In-Place Operators
In-place assignment operators (also called compound assignment operators) perform an operation in-place on a variable provided as first operand. They overwrite the value of the first operand variable with the result of the operation when performing the operator without assignment. For example, x += 3
is the same as x = x + 3
of first calculating the result of x +3
and then assigning it to the variable x.
Operator | Name | Short Example | Equivalent Long Example |
---|---|---|---|
= | In-place Assignment | x = 3 | |
+= | In-place Addition | x += 3 | x = x + 3 |
-= | In-place Subtraction | x -= 3 | x = x - 3 |
*= | In-place Multiplication | x *= 3 | x = x * 3 |
/= | In-place Division | x /= 3 | x = x / 3 |
%= | In-place Modulo | x %= 3 | x = x % 3 |
//= | In-place Integer Division | x //= 3 | x = x // 3 |
**= | In-place Power | x **= 3 | x = x ** 3 |
&= | In-place Bitwise And | x &= 3 | x = x & 3 |
|= | In-place Bitwise Or | x |= 3 | x = x | 3 |
^= | In-place Bitwise XOR | x ^= 3 | x = x ^ 3 |
>>= | In-place Bitwise Shift Right | x >>= 3 | x = x >> 3 |
<<= | In-place Bitwise Shift Left | x <<= 5 | x = x << 5 |