Pythonで数値の最初と最後のビットだけがセットされているかを判定する方法
問題の概要
ある数値 n が与えられたとき、その2進表現において「最初(最上位)」と「最後(最下位)」の位置にのみビットがセットされている(1になっている)かどうかを判定します。
例えば、入力が n = 17 の場合、2進表現は 10001 となり、最初と最後の位置にだけ 1 が存在するため、結果は True になります。
解決のアプローチ
この問題は、以下の手順で効率的に解くことができます。
- n が 1 と等しい場合は True を返します(2進表現が「1」のみで、最初と最後の位置が一致しているため)。
- それ以外の場合は、「n - 1 が 2 のべき乗であるか」を判定します。2のべき乗であれば True、そうでなければ False を返します。
この手法が有効な理由は、最初と最後のビットのみがセットされた数値は「2k + 1」の形で表せるからです。この値から 1 を引くと「2k」となり、必ず 2 のべき乗になります。
サンプルコード
def is_pow_of_two(n):
return (n & n-1) == 0
def solve(n):
if n == 1:
return True
return is_pow_of_two(n-1)
n = 17
print(solve(n))入力
17
出力
True
ポイント解説
(n & n-1) == 0 というビット演算は、数値が 2 のべき乗かどうかを判定する定番のテクニックです。2 のべき乗の数値から 1 を引くと下位のビットがすべて反転するため、元の数値との AND 演算の結果が 0 になります。この性質を利用することで、ループや除算を使わずに O(1) の計算量で判定が可能です。
-
Pythonで数値の全ビットがセット(1)されているかどうかを確認する方法
問題の概要ある整数 n が与えられたとき、その数値のすべてのビットが 1(セット済み)になっているかどうかを判定します。例えば、n = 255 の場合、255 の2進表現は「11111111」となり、すべてのビットが 1 なので、結果は True になります。一方、n = 10(2進数で「1010」)のように 0 のビットが含まれる場合は False となります。解決のアプローチこの問題は、次の手順で解くことができます。数値が 0 と等しい場合は False を返す数値が 0 より大きい間、以下を繰り返す最下位ビットが 0(つまり偶数)であれば False を返す数値を右に1ビットシフトする(
-
Pythonで文字列に英字と数字がそれぞれ1つ以上含まれているか判定する方法
Pythonである文字列に「少なくとも1つの英字」と「少なくとも1つの数字」の両方が含まれているかどうかを判定したい場面は、パスワードのバリデーションなどでよくあります。最も手軽な方法は正規表現(regular expressions)を使うことです。re.match(regex, string)を利用すれば、指定した文字列に英字と数字が両方存在するかを一度にチェックできます。正規表現を使った判定方法以下の例では、先読み(lookahead)と呼ばれる?=構文を使って、文字列中に英字と数字がそれぞれ1つ以上あることを確認しています。import re print(bool(re.match(