レッスン124
Python演習ドリル200 基礎練習21〜30⌗
Pythonプログラムを学び始めた方向けの演習ドリルです。
今回は、基礎練習の21〜30です。
jupyterとjupyter notebook⌗
本演習ではjupyter notebookを使用します。 インストールされているか確認してください。 インストールされていない場合、jupyterとjupyter notebookのインストール方法については、レッスン33を参照してください。
演習前の基礎学習⌗
実際にjupyter notebookを使用して演習を行う前に、演習の中で使用するPythonの機能について学習しましょう。
-
ビット処理
数値を2進数として、各桁(ビット)単位に処理することをビット処理と言います。
-
ビット演算
各桁(ビット)ごとに、演算処理を行うことをビット演算といいます。
ビット演算には条件分岐の時に説明した論理演算同様、
and、or、not、xorの4種類の演算子があります。ビット演算では論理演算とは異なり、「True/False」の代わりに「0/1」というビット値(各ビットの値)を使い、4つの演算子はそれぞれ、
&、|、~、^というビット演算子で表現します。変数
aと変数bをビット演算すると、各変数を2進数にしたときの各桁の値ごとにそれぞれ演算し、その結果を出力します。例えば変数
aと変数bにそれぞれ10進数で5と3の値が入っているとすると、ビットでは以下のように表現されます。変数 10進数 2進数 4ビット目 3ビット目 2ビット目 1ビット目 a 5 101 0 1 0 1 b 3 11 0 0 1 1 a & bでビットのand処理を行うと、
- 1ビット目:
1 & 1 = 1 - 2ビット目:
0 & 1 = 0 - 3ビット目:
1 & 0 = 0 - 4ビット目:
0 & 0 = 0
なので
0001というビット値(2進数)になり、10進数でいうと1の値になります。同様に
a | bでビットのor処理を行うと、- 1ビット目:
1 | 1 = 1 - 2ビット目:
0 | 1 = 1 - 3ビット目:
1 | 0 = 1 - 4ビット目:
0 | 0 = 0
なので
0111というビット値(2進数)になり、10進数でいうと7に値になります。上の表では簡易的に4桁のビットで表現しましたが、Pythonの場合、桁数に上限はなく、全ての桁のビットで処理が行われます。 なお、通常のプログラミング言語では32桁または64桁のビットで処理が行われます。
Pythonで
~(not)を使用すると、値は負の値として表示されます。 正の値で表現したい場合は、必要な桁数分1で埋まった値(8桁なら0b11111111)とand処理(&)を行う必要があります。 - 1ビット目:
-
ビットのシフト
x >> yという演算子を使用すると、x変数の各桁のビット値をy変数で指定した値分、右方向の桁(下位の桁)に移動した値が得られます。 演算結果をx変数に設定し直したい場合は、x >>= yのように記述します。例えば変数
aに2進数で1010(10進数で10)の値が入っているとa >> 1の値は2進数で0101(10進数で5)です。 シフトした最上位(左端)の桁には0が入ります。 1つシフトするごとに10進数の値は元の値の2分の1(小数点切り捨て)になります。x << yという演算子を使用すると、x変数の各桁のビット値をy変数で指定した値分、左方向の桁(上位の桁)に移動した値が得られます。 演算結果をx変数に設定し直したい場合は、x <<= yのように記述します。例えば変数
aに2進数で1010(10進数で10)の値が入っているとa << 1の値は2進数で10100(10進数で20)です。 シフトした最下位(右端)の桁には0が入ります。 1つシフトするごとに10進数の値は元の値の2倍になります。 -
ビットのセット・クリア
Pythonでは、ある桁のビット値を1にしたり(セット)、0にしたり(クリア)する演算子はありません。 このような処理を行いたい場合、以下のようにシフトとビット演算を組み合わせることで、セット・クリアを実行します。
- ビットのセット
変数xの右(下位)から0から数えてn番目のビットをセットしたい場合の式は、
x = x | (1 << n)となります。x |= 1 << nのように記述することもできます。- ビットのクリア
変数xの右(下位)から0から数えてn番目のビットをクリアしたい場合の式は、
x = x & ~(1 << n)となります。x &= ~(1 << n)のように記述することもできます。
-
-
2進数の出力方法
10進数の2進数の値に変換するには
bin()関数を使います。 出力結果は0bXXXX(Xは0か1の値)のような文字列になります。またf文字列の中の変数値を2進数表記で出力することもできます。
f"{変数:b}"とすると、変数値は0bが付かない2進数値で表示されます。 その際、{変数:8b}のようにbの前に数字を入れると桁数が指定でき、桁数に足りない分は左側をスペースで埋めてくれます。 また、{変数:08b}のように数字の前に0を入れると桁数に足りない分は左側を0で埋めてくれます。 -
累乗の演算子
aのn乗というのを累乗と呼びます。 aのn乗とは、aをn回かけ合わせた結果のことです。
Pythonには
**という累乗の演算子が用意されているのでaのn乗であればa ** nのように簡単に演算できます。
演習⌗
それでは実際にjupyter notebookを使用して、演習を行います。
コマンドラインからgit pullを実行してmcc1フォルダに最新のファイルをダウンロードしてください。
ターミナルのコマンドラインからcd mcc1/code/jupyterを実行して、jupyterフォルダに移動し、jupyter notebookを実行してください。
すると、ブラウザが起動し、jupyterのホーム画面が表示されます。
その中からPython演習ドリル200基礎練習21〜30.ipynbをクリックしてください。
そうするとPython演習ドリル200基礎練習21〜30というタイトルの演習問題が表示されます。
課題21から課題30までありますので、課題の内容にしたがって、In[]:の部分にPythonプログラムを書いてください。 書き終わったら、画面上の ▶| Run というアイコンをクリックすると、今書いたPythonプログラムが実行されます。
出力結果が課題の(実行画面)と一致するか確認してください。
どうしても正解がわからないときは、▶プログラム例 をクリックすると、正解例のPythonプログラムが表示されます。
まとめ⌗
今回はPython演習として、繰り返しの続きとビット処理を行いました。
今後も新しい演習問題を追加していきますので、演習を通じてPythonを学んでいきましょう。