# [Python-ideas] String and bytes bitwise operations

Terry Reedy tjreedy at udel.edu
Thu May 17 11:57:26 EDT 2018

```On 5/17/2018 6:53 AM, Ken Hilton wrote:
> Hi all,
>
> We all know the bitwise operators: & (and), | (or), ^ (xor), and ~
> (not). We know how they work with numbers:
>
> 420 ^ 502
>
> 110100100
> 111110110
> == XOR ==
> 001010010
> = 82
>
> But it might be useful in some cases to (let's say) xor a string (or
> bytestring):
>
> HELLO ^ world
>
> 01001000 01000101 01001100 01001100 01001111
> 01110111 01101111 01110010 01101100 01100100
> =================== XOR ====================
> 00111111 00101010 00111110 00100000 00101011
> = ?*> +
>
> Currently, that's done with this expression for strings:
>
>      >>> ''.join(chr(ord(a) ^ ord(b)) for a, b in zip('HELLO', 'world'))
>      '?*> +'
>
> and this expression for bytestrings:
>
>      >>> bytes(a ^ b for a, b in zip(b'HELLO', b'world'))
>      b'?*> +'
>
> It would be much more convenient, however, to allow a simple xor of a
> string:
>
>      >>> 'HELLO' ^ 'world'
>      '?*> +'
>
> or bytestring:
>
>      >>> b'HELLO' ^ b'world'
>      b'?*> +'
>
> (All of this applies to other bitwise operators, of course.)
> Compatibility issues are a no-brainer - currently, bitwise operators for
> strings raise TypeErrors.

https://bugs.python.org/issue19251 bitwise ops for bytes of equal length

--
Terry Jan Reedy

```