指定した範囲内の未設定ビットを数えるPythonプログラム
正の整数とビット位置の範囲が与えられたとき、その範囲内に含まれる未設定ビット(値が「0」のビット)の個数を数える方法を解説します。
入力 : n = 50, 開始位置 = 2, 終了位置 = 5 出力 : 2
この例では、ビット位置2から5の範囲内に「0」のビットが2つ存在します。実際、50を2進数で表すと 110010 となり、下位から数えて3番目(位置2)と6番目(位置5)に該当する部分に「0」が2つ含まれています。
アルゴリズム
bin()関数を使って、整数 n を2進数の文字列に変換します。- 先頭の2文字(プレフィックス "0b")を取り除きます。
- 文字列を反転させます。これにより、最下位ビットがインデックス0に対応するようになります。
- インデックス st-1 から ed-1 までの範囲(ed は排他的)を走査し、「0」のビットをカウントします。
サンプルコード
# 範囲内の未設定ビットを数える関数
def countunsetbits(n, st, ed):
# n を2進数に変換する
bi = bin(n)
# 先頭の2文字("0b")を削除する
bi = bi[2:]
# 文字列を反転させる
bi = bi[-1::-1]
# インデックス st-1 から ed-1 までの範囲で
# 未設定ビット「0」をカウントする(ed は排他的)
print(len([bi[i] for i in range(st - 1, ed) if bi[i] == '0']))
# ドライバープログラム
if __name__ == "__main__":
n = int(input("正の整数を入力してください ::>"))
st = int(input("開始位置を入力してください"))
ed = int(input("終了位置を入力してください"))
countunsetbits(n, st, ed)
実行結果
正の整数を入力してください ::> 50 開始位置を入力してください 2 終了位置を入力してください 5 2
このプログラムでは、Pythonのスライス操作とリスト内包表記を活用することで、指定範囲内の「0」のビットを簡潔に数えています。ビット演算を扱う際には、ビット列の並び順(左端か右端のどちらを基準にするか)に注意することが重要です。
-
Pythonで配列の反転数(転倒数)をカウントする方法
はじめに この記事では、配列内の反転(インバージョン)をカウントする問題とその解決策について詳しく解説します。 問題定義 問題: リストが与えられたとき、その中に含まれる反転の数をカウントして表示します。 反転数とは、配列を昇順にソートされた状態にするために必要な入れ替え(スワップ)の回数を表す指標です。具体的には、i < j かつ arr[i] > arr[j] を満たす要素のペア(i, j)の総数として定義されます。 実装例 # 反転数をカウントする関数 def InvCount(arr, n): inv_count = 0 for i in range(n
-
Pythonで数値の合計ビット数をカウントするプログラムの作成方法
まず数値を入力し、bin()関数を使ってその数値を2進数に変換します。次に出力される文字列の先頭2文字「0b」を削除し、最後に2進数文字列の長さを計算することで、合計ビット数を求めることができます。 実行例 入力:200 出力:8 解説 200の2進数表現は 11001000 です(8桁=8ビット) アルゴリズム ステップ1:数値を入力する。 ステップ2:bin()関数を使用して、数値を2進数に変換する。 ステップ3:bin()関数は出力文字列の先頭に「0b」という接頭辞を付加するため、 出力された2進数文字列から最初の2文字「0b」を削除する。 ステップ4:2進