Pythonで数値の特定の位置から「k」ビットを抽出する方法
この関数は、指定した位置(pos)から「k」個のビットを抽出し、その抽出結果を返すために使用します。ここでは、Pythonのスライス(slicing)という手法を活用して実装していきます。
実行例
入力:number = 170
K = 5
Pos = 2
出力:21
上記の例では、10進数の「170」を2進数に変換すると「10101010」となります。右端から2番目の位置を起点として、そこから左方向に5ビットを抽出すると「10101」になり、これを10進数に戻すと「21」になります。
アルゴリズム
Extractionbit(no, k, pos)
/* ユーザーが入力した数値は変数 no に、
抽出するビット数は変数 k に、
ビットの位置は変数 pos に格納されます。 */
ステップ1:bin() 関数を使って、数値を2進数形式に変換します。
ステップ2:先頭の2文字('0b')を取り除きます。
ステップ3:右側から pos の位置を終点として、そこから k ビット分を抽出します。
抽出部分の終了インデックスは e = len(bi) - pos、
開始インデックスは s = e - k + 1 となります。
ステップ4:k ビットの部分文字列を抽出します。
ステップ5:抽出した部分文字列を再び10進数に変換します。
サンプルコード
# 数値内の指定された位置から「k」ビットを抽出するPythonプログラム
def extractedbits(no, k, pos):
bi = bin(no) # 数値を2進数形式の文字列に変換
bi = bi[2:] # 先頭の '0b' を削除
e = len(bi) - pos # 抽出範囲の終了インデックスを計算
s = e - k + 1 # 抽出範囲の開始インデックスを計算
substr = bi[s : e+1] # スライスで k ビットを抽出
print("最終結果 ::>", int(substr, 2)) # 2進数から10進数へ変換して表示
# メインプログラム
if __name__ == "__main__":
no = int(input("数値を入力してください ::>"))
k = int(input("抽出するビット数 k を入力してください ::>"))
pos = int(input("位置を入力してください ::>"))
extractedbits(no, k, pos)
実行結果
数値を入力してください ::>170 抽出するビット数 k を入力してください ::>5 位置を入力してください ::>2 最終結果 ::>21
コードのポイント解説
bin() 関数: Pythonの組み込み関数 bin() は、整数を「0b10101010」のような2進数表現の文字列に変換します。そのため、スライス bi[2:] を使って接頭辞「0b」を除去しています。
インデックス計算: 文字列のインデックスは左端が0から始まるため、右側からの位置 pos を考慮すると、終了インデックスは「文字列の長さ − pos」となります。開始インデックスはそこからさらに k ビット分遡った位置になります。
int(substr, 2): 第2引数に「2」を指定することで、2進数の文字列を10進数の整数に変換できます。これにより、抽出したビット列を人間が読みやすい数値として出力しています。
-
【Python】1からnまでの全整数に含まれるセットビットの総数をカウントする方法
正の整数 n が与えられたとき、1 から n までの各数値を2進表現に変換し、それぞれに含まれる「セットビット(値が1になっているビット)」の総数をカウントするプログラムを作成してみましょう。 セットビットとは? 2進数において「1」となっているビットのことをセットビットと呼びます。例えば、数値 3 を2進数で表すと 11 となり、セットビットは 2 個あります。本記事では、1 から n までのすべての整数についてこのセットビット数を合計します。 実行例 Input : n=3 Output : 4 n = 3 の場合を確認してみます。 1 → 1 :セットビット 1 個 2 → 10
-
【初心者向け】Pythonで文章から重複する単語をすべて削除する方法
プログラミングでは、与えられた文章から重複する単語を取り除いて整理したい場面がよくあります。本記事では、Pythonの標準ライブラリ「collections.Counter」を活用して、文章内の重複単語を効率的に削除する方法を解説します。処理の概要たとえば、次のような文章が与えられたとします。入力:I am a peaceful soul and blissful soul. 出力:I am a peaceful soul and blissful.このように、「soul」という単語が2回出現している場合、2回目以降の出現を削除し、各単語が1回だけ含まれる文章を作成します。アルゴリズムの手順重