この記事では、Pythonで2進数や8進数、16進数を生成する方法について解説します。また、それらの位取り記数法を使ったビット演算と演算子を紹介します。
2進数の生成と出力
2進数を表現するには、数値リテラルの先頭に 0b
を付けます。大文字(0B
)でも可能です。
b = 0b001
print(b, type(b))
b = 0B011
print(b, type(b))
実行結果
1 <class 'int'>
3 <class 'int'>
8進数の場合は0o
または 0O
、16進数の場合は0x
または 0X
を付けます。
生成された値は int
型 となります。なので通常の演算も可能です。
x = 0b100
y = 0B010
print(f'{x} + {y} = {x + y}')
print(f'{x} - {y} = {x - y}')
print(f'{x} * {y} = {x * y}')
print(f'{x} / {y} = {x / y}')
実行結果
4 + 2 = 6
4 - 2 = 2
4 * 2 = 8
4 / 2 = 2.0
print()
関数で出力する際に2進数が10進数に直されてしまっています。2進数のまま出力したい場合は、bin()
関数を使います。
x = 0b100
print(bin(x))
y = 0B010
print(bin(y))
実行結果
0b100
0b10
8進数の場合はoct()
関数、16進数の場合はhex()
関数を使います。
bin()
関数の戻り値は文字列になっているので 2進数として使う事はできません。2進数として使いたい場合は、int(変換する値, 進数)
で変換できます。
# 99の2進数の文字列を生成
s_b = bin(99)
print(s_b)
# int(変換する値, 進数)
print(int(s_b, 2))
実行結果
0b1100011
99
8進数の場合int(値, 8)
、16進数の場合int(値, 16)と指定します。
これでビットを生成して出力することができるようになりました。
ビット演算
それでは、ビット演算について見ていきましょう。
使用する演算子は以下のとおりです。
& | 論理積 |
---|---|
| | 論理和 |
^ | 排他的論理和 |
~ | ビット反転 |
<< | 左シフト |
>> | 右シフト |
論理積: &
&
演算子を使うことで論理積を求めることができます。論理積とは、両方の桁が 1 のときのみ 1 となります。
a = 0b101
b = 0B011
print(f'結果: {a & b}')
print(f'bin: {bin(a & b)}')
実行結果
結果: 1
bin: 0b1
論理和: |
|
演算子を使うことで論理和を求めることができます。論理和とは、どちらかの桁が 1 ならば 1 となります。
a = 0b101
b = 0B011
print(f'結果: {a | b}')
print(f'bin: {bin(a | b)}')
実行結果
結果: 7
bin: 0b111
排他的論理和: ^
^
演算子 を使うことで排他的論理和を求めることができます。排他的論理和とは、同じでない桁が 1 となります。
a = 0b101
b = 0B011
print(f'結果: {a ^ b}')
print(f'bin: {bin(a ^ b)}')
実行結果
結果: 6
bin: 0b110
ビット反転: ~
~
演算子を使うことで1を足したマイナスな値になる。
x = 0b101
print(~x, bin(~x))
y = 0B011
print(~y, bin(~y))
実行結果
-6 -0b110
-4 -0b100
ビットシフト: <<, >>
<<
演算子を使うことでビットを左にずらし、>>
演算子を使うことでビットを右にずらします。
x = 0b1010
print(x << 1, bin(x << 1))
x = 0b1010
print(x >> 1, bin(x >> 1))
実行結果
20 0b10100
5 0b101
まとめ
この記事では、Python でビット演算する方法を解説しました。
ビット演算できなくてもあまり問題ありませんが、フラグや画像処理で使われたりします。また他の言語でも使われたりするので覚えていて損はありません。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ