Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで整数の2進表現に含まれる1のビット数を数える方法

ある整数 n が与えられたとき、その数を2進数で表した際に含まれる「1」のビット(セットビット)の個数を求めることを考えます。この問題は「ポピュレーションカウント」や「ハミング重み」と呼ばれることもあり、ビット演算の基礎を学ぶのに最適な題材です。

問題の例

例えば、入力が 12 の場合を考えてみましょう。12 を2進数で表すと 1100 となり、「1」のビットは2個含まれています。したがって、出力は 2 になります。

解法のアプローチ

この問題は、次の手順で解くことができます。

  • カウンター変数 count を 0 で初期化する
  • n が 0 になるまで以下を繰り返す
    • n の最下位ビット(n AND 1)を count に加算する
    • n を右に1ビットシフトする(n ÷ 2 の切り捨てと同等)
  • count を返す

ポイントは「n & 1」というビットAND演算です。これは n の最下位ビットが 1 なら 1、0 なら 0 を返すため、各桁が 1 かどうかを効率的に判定できます。また、「n >>= 1」による右シフトで数値を半分にしながら、すべてのビットを先頭から順に調べていきます。

実装例

それでは、実際のコードを見てみましょう。

class Solution:
    def solve(self, n):
        count = 0
        while (n):
            count += n & 1
            n >>= 1
        return count

ob = Solution()
print(ob.solve(12))

入力

12

出力

2

補足:より簡単な代替手段

Pythonでは、組み込みメソッドを使って同じ結果をより簡潔に得ることもできます。

  • bin(n).count('1') — 2進数の文字列に変換してから「1」の出現回数を数える方法
  • n.bit_count() — Python 3.10 以降で利用可能な、セットビット数を直接返すメソッド

ただし、ビット演算による上記の実装方法は、アルゴリズムの仕組みを理解するうえで重要です。計算量は O(log n)(ビット長に比例)であり、非常に効率的です。

  1. Pythonでリスト内の最小値を見つける方法を解説

    この記事では、リストの中から最小の数値を見つける方法について、具体的なサンプルコードとともに詳しく解説します。問題の概要問題: 数値のリストが与えられたとき、その中に含まれる最も小さい数値を画面に表示すること。この問題を解くアプローチは主に2つあります。ひとつは sort() メソッドを使ってリストを昇順に並べ替え、先頭の要素(インデックス0)を取得する方法。もうひとつは、Pythonに標準で用意されている組み込み関数 min() を使う方法です。それぞれ順番に見ていきましょう。方法1:sort()メソッドで並べ替えて最小値を取得するまずはリストを昇順にソートし、先頭の要素を取り出す方法です。

  2. セットを使って文字列内の母音の数をカウントするPythonプログラム

    本記事では、Pythonを使って文字列内に含まれる母音の数をカウントする方法について解説します。セット(set)を活用した効率的な実装を中心に、初心者の方にもわかりやすく説明していきます。 問題の概要 問題文:任意の文字列が与えられたとき、その文字列に含まれる母音の数をセットを使って数えます。 基本的なアプローチとしては、文字列全体を先頭から順に走査し、各文字が母音であるかどうかを判定します。母音であればカウントを1ずつ増やしていき、最終的な合計を出力します。 実装例 def vowel_count(str_): count = 0 # 母音をセットとして定義 vowe