Python演習ドリル200 基礎練習21〜30

Pythonプログラムを学び始めた方向けの演習ドリルです。

今回は、基礎練習の21〜30です。

jupyterとjupyter notebook

本演習ではjupyter notebookを使用します。 インストールされているか確認してください。 インストールされていない場合、jupyterjupyter notebookのインストール方法については、レッスン33を参照してください。

演習前の基礎学習

実際にjupyter notebookを使用して演習を行う前に、演習の中で使用するPythonの機能について学習しましょう。

  • ビット処理

    数値を2進数として、各桁(ビット)単位に処理することをビット処理と言います。

    • ビット演算

      各桁(ビット)ごとに、演算処理を行うことをビット演算といいます。

      ビット演算には条件分岐の時に説明した論理演算同様、andornotxorの4種類の演算子があります。

      ビット演算では論理演算とは異なり、「True/False」の代わりに「0/1」というビット値(各ビットの値)を使い、4つの演算子はそれぞれ、&|~^というビット演算子で表現します。

      変数aと変数bをビット演算すると、各変数を2進数にしたときの各桁の値ごとにそれぞれ演算し、その結果を出力します。

      例えば変数aと変数bにそれぞれ10進数で53の値が入っているとすると、ビットでは以下のように表現されます。

      変数10進数2進数4ビット目3ビット目2ビット目1ビット目
      a51010101
      b3110011

      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処理(&)を行う必要があります。

    • ビットのシフト

      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を学んでいきましょう。