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

Pythonで特定の位置のビットがセットされているかどうかを判定する方法

プログラミングにおいて、ある整数 n の特定のビットが 1(セット) なのか 0(未セット) なのかを判定したい場面はよくあります。本記事では、Pythonを使って k番目のビット がセットされているかどうかを効率的に確認する方法を解説します。ここでいう k番目のビットは、最下位ビット(右端)から数えて 何番目かを意味します。

問題の概要

例として、n = 18k = 2 が入力された場合を考えてみましょう。18を2進数で表すと 10010 となります。右から2番目のビットは 1 であるため、出力は「Set」となります。

解決のアプローチ

この問題は、ビット演算(右シフトと論理積)を組み合わせることで簡単に解けます。手順は以下の通りです。

  • ステップ1: n を (k − 1) 回だけ右にシフトし、その結果を temp に代入する
  • ステップ2: temp と 1 の論理積(AND)を計算する
  • ステップ3: 結果が 1 であれば「Set」を返し、そうでなければ「Unset」を返す

ポイントは、(k − 1) 回の右シフトによって目的のビットが最下位ビットに移動する という点です。その後、1とのAND演算を行えば、そのビットが0か1かを即座に判定できます。

実装コード

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

def solve(n, k):
    temp = n >> (k - 1)
    if temp & 1:
        return "Set"
    return "Unset"

n = 18
k = 2
print(solve(n, k))

入力

n = 18, k = 2

出力

Set

処理の流れを詳しく見る

上記のコードがどのように動作するのか、具体的に追ってみます。

  • 18の2進数表現は 10010
  • k = 2 なので、1回だけ右シフト → 1001(10進数で9)
  • 9 と 1 のAND演算 → 最下位ビットが 1 なので結果は 1
  • よって「Set」を返す

まとめ

このように、右シフトとAND演算を組み合わせることで、任意の位置のビット状態をわずか数行のコードで判定できます。計算量は O(1) であり、非常に効率的です。ビット操作はフラグ管理やデータ圧縮、低レベル処理など幅広い場面で活用される重要なテクニックなので、ぜひマスターしておきましょう。

  1. Pythonで与えられたグラフが2部グラフかどうかを判定するプログラム

    2部グラフとは無向グラフが与えられたとき、そのグラフが2部グラフ(バイパータイトグラフ)であるかどうかを判定する方法を解説します。2部グラフとは、グラフのすべての頂点を2つの集合 A と B に分割でき、グラフ内のすべての辺 {u, v} が必ず一方の端点 u が集合 A、もう一方の端点 v が集合 B に属するようなグラフのことです。つまり、同じ集合内の頂点同士を結ぶ辺(A-A や B-B)が一切存在しないグラフです。例として、次のようなグラフを考えてみましょう。この場合、頂点 [0, 4] を集合 A に、[1, 2, 3] を集合 B に分類できます。すべての辺は A から B、または

  2. Pythonで文字列がパングラムかどうかを判定するプログラムの作成方法

    本記事では、与えられた文字列がパングラムであるかどうかを判定するPythonプログラムの解法とアプローチについて詳しく解説します。 問題の概要 文字列入力が与えられたとき、その文字列がパングラムであるかどうかを判定するPythonプログラムを作成します。 パングラムとは? パングラムとは、英語のアルファベット26文字すべてを少なくとも1回ずつ含む文章や一連の単語のことです。有名な例として「The quick brown fox jumps over the lazy dog」があります。 解法のアプローチ この問題は、以下の手順で解くことができます。 アルファベット全体を表す基準となる文字列