[Python] bit演算で偶数奇数の判断

普通は「%」を使って偶奇の判断を行うと思いますが、ここではbit演算の「and」で数字の偶奇の判断を行ってみます。

ビット単位演算

ビット演算(ビットえんざん、bitwise operation: 直訳すると「ビット毎操作」)とは、固定長のワードなどといった「ビットのカタマリ」(コンピュータの数値表現なども参照)に対して、各のビット全てに対する論理演算をいっぺんに行う演算操作である。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

整数型におけるビット単位演算

Python ビット演算 超入門

ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜

bin()

bin()を使うことで、10進数の数字を2進数に変換できます。

bin(x)

インタラクティブモードで、10進数0から7を2に進数に変換してみます。

>>> bin(0)
'0b0'
>>> bin(1)
'0b1'
>>> bin(2)
'0b10'
>>> bin(3)
'0b11'
>>> bin(4)
'0b100'
>>> bin(5)
'0b101'
>>> bin(6)
'0b110'
>>> bin(7)
'0b111'

奇数の時は一桁目が1、偶数の時は1桁目が0になっていることが分かります。

AND演算

pythonでは、x & yと書くことで、x と y のビット単位 論理積を得ることができます。

AND結果
0 & 00
0 & 10
1 & 00
1 & 11

数字と1を&することで、偶数の時は0、奇数の時は1になります。

"""
    1 : 0 0 1
        0 0 1 &
        -----
        0 0 1

    3 : 0 1 1
        0 0 1 &
        -----
        0 0 1

    2 : 0 1 0
        0 0 1 &
        ------
        0 0 0
"""

関数にまとめて試してみます。

>>> def is_even_odd(x: int):
...     if x & 1 ==0:
...         return '偶数'
...     return '奇数'
...
>>> print(is_even_odd(200))
偶数
>>> print(is_even_odd(999))
奇数

想定通りの結果になりました。

以下に続きます。

今回は、bit演算で与えられた整数を2進数にした時、n番目のbitが立っているか調べてみます。 簡略化のため、n番目は0から始まると考えます。 シフト演算 シフト演算とは、2進数の桁をずらす演算です。 左にずらす左シフト <<と、...