この記事では、Pythonで2進数や8進数、または16進数を生成する方法について解説します。
また、それらの位取り記数法を使ったビット演算と演算子を紹介します。
2進数、8進数、16進数の生成
2進数を表現するには、数値リテラルの先頭に0bを付けます。大文字(0B)でも可能です。
b = 0b001 print(b, type(b)) b = 0B011 print(b, type(b))
実行結果
1 <class 'int'> 3 <class 'int'>
8進数の場合は、0o、または0Oで表現します。
o = 0o001 print(o, type(o)) o = 0O011 print(o, type(o))
実行結果
1 <class 'int'> 9 <class 'int'>
16進数の場合は0xまたは0Xを付けます。
x = 0x001 print(x, type(x)) x = 0X011 print(x, type(x))
実行結果
1 <class 'int'> 17 <class 'int'>
n進数の出力
2進数をprint()関数で出力すると10進数に直されて出力されてしまいます。2進数表記のまま出力したい場合は、bin()関数を使います。
x = 0b100 print(bin(x)) x = 0B010 print(bin(x))
実行結果
0b100 0b10
8進数の場合はoct()関数、16進数の場合はhex()関数を使います。
x = 0o010 print(oct(x)) x = 0x010 print(hex(x))
実行結果
0o10 0x10
これらの関数の戻り値は文字列です。演算に使用するには数値に変換する必要があります。
n進数への変換
n進数の文字列を数値として扱いたい場合は、int(変換する値, 基数)で変換できます。
# 99の2進数の文字列を生成 b = bin(99) print(b) # 2進数に変換 print(int(b, 2))
実行結果
0b1100011 99
8進数の場合int(値, 8)、16進数の場合int(値, 16)と指定します。
通常の演算
生成された値は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
ビット演算
それでは、ビット演算について見ていきましょう。
使用する演算子は以下のとおりです。
| & | 論理積 |
|---|---|
| | | 論理和 |
| ^ | 排他的論理和 |
| ~ | ビット反転 |
| << | 左シフト |
| >> | 右シフト |
論理積: &演算子
&演算子を使うことで論理積を求めることができます。論理積とは、両方の桁が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でビット演算する方法を解説しました。
ビット演算できなくてもあまり問題ありませんが、フラグや画像処理で使われたりします。また他の言語でも使われたりするので覚えていて損はありません。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ


