Pythonで整数のセットビット(1の数)をカウントする方法
この記事では、与えられた整数の2進数表現に含まれる「1」の個数(セットビット数)をカウントするPythonプログラムについて解説します。
問題定義
整数 n が与えられたとき、その2進数表現の中に「1」がいくつ現れるかを求めます。この操作は一般にポピュレーションカウント(popcount)と呼ばれ、ビット演算やアルゴリズムの基礎を学ぶうえで重要なテーマです。
例えば n = 15 の場合、2進数表現は 1111 となるため、セットビットの数は 4 になります。
方法1:素朴なアプローチ(ループ処理)
最も基本的な方法は、整数を右シフトしながら最下位ビットが1かどうかを順番に確認していくものです。
サンプルコード
# ビットをカウントする関数
def count(n):
count = 0
while (n):
count += n & 1 # 最下位ビットが1なら加算
n >>= 1 # 右に1ビットシフト
return count
# メイン処理
n = 15
print("セットビットの数 :", count(n))実行結果
セットビットの数 : 4
方法2:再帰的なアプローチ
同じロジックは再帰を使っても実装できます。ベースケースとして n が 0 のときに 0 を返し、それ以外では最下位ビットの値と、右シフトした値に対する再帰呼び出しの結果を足し合わせます。
サンプルコード
# 再帰による実装
def count(n):
# ベースケース
if (n == 0):
return 0
else:
# 最下位ビットがセットされているか確認
return (n & 1) + count(n >> 1)
# メイン処理
n = 15
print("セットビットの数 :", count(n))実行結果
セットビットの数 : 4
補足:Python 3.10以降の組み込み関数
Python 3.10 以降では、標準ライブラリの組み込みメソッド int.bit_count() を使うことで、セットビットの数を一行で取得できます。
n = 15 print(n.bit_count()) # 出力: 4
また、bin(n).count("1") のように2進数文字列に変換して数える方法もよく知られています。実務ではこれらの組み込み機能を利用するのが簡潔で高速です。
まとめ
この記事では、ループと再帰という2つのアプローチを用いて、整数に含まれるセットビットの数をカウントするPythonプログラムを作成しました。どちらの方法も計算量は O(log n) であり、ビット演算の基本的な考え方を理解するのに適した例題です。さらに、Python 3.10以降では bit_count() メソッドを使えばより簡単に実現できることも紹介しました。
-
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進