Pythonで10進数整数の2進補数(ビット補完)を求める方法
この記事では、10進数で与えられた整数に対して、その2進表現における補数(ビット反転)を求め、再び10進数に変換して返す方法を解説します。
例として、数値が 20 の場合を考えてみましょう。20の2進表現は 10100 です。これをビットごとに反転すると 01011 となり、これを10進数に戻すと 11 になります。これが求める答えです。
解法のアプローチ
この問題は、以下の手順で解くことができます。
sを数値 n の2進表現の文字列とします(Pythonのbin()関数を使うと「0b」プレフィックス付きの文字列が得られます)。sum = 0、num = 1で初期化します。- 文字列
sを末尾から先頭に向かって1文字ずつ処理します。- 現在の文字が
'b'であれば、「0b」プレフィックスに到達したことを意味するので、そこでsumを返して終了します。 - 現在の文字が
'0'であれば、元の数ではその桁が1だったことを意味するため、sum += numとして値を加算します。 - 1文字処理するごとに
num *= 2として桁の重みを2倍にしていきます。
- 現在の文字が
つまり、元の2進表現で「0」だった桁だけを1として足し合わせることで、補数の値を効率的に計算できます。
実装例
それでは、実際のコードを見て理解を深めましょう。
class Solution(object):
def bitwiseComplement(self, N):
s = str(bin(N))
sum = 0
num = 1
for i in s[::-1]:
if i == "b":
return sum
elif i == "0":
sum += num
num *= 2
ob1 = Solution()
print(ob1.bitwiseComplement(20))
入力
20
出力
11
コードのポイント
bin(N)は数値を「0b10100」のような形式の文字列に変換します。スライスs[::-1]を使うことで、文字列を逆順に走査しています。- 逆順に走査することで、下位ビットから順に処理でき、
numを2倍ずつ増やしながら各桁の重みを正しく反映できます。 - 計算量は2進表現の桁数に比例し、O(log N) で非常に効率的です。
-
Pythonで二分木のパス合計(Path Sum)を判定する方法
パス合計問題とは二分木と目標の合計値が与えられたとき、根から葉までの経路をたどった際のノード値の合計が、与えられた値と一致するような経路が存在するかどうかを判定します。例として、木が [0, -3, 9, -10, null, 5] という構成で、合計値が 14 の場合を考えてみましょう。このとき、0 → 9 → 5 という経路が存在し、その合計はちょうど 14 になるため、答えは True となります。解法のアプローチこの問題は再帰を使うことで簡潔に解くことができます。手順は以下の通りです。根ノードが null(空)の場合、False を返します。左右の子ノードが両方とも空(つまり葉ノード)
-
Pythonのcodeモジュール入門:インタプリタ基本クラスの使い方
Pythonの対話モードは、REPL(Read-Evaluate-Print-Loop:読み込み・評価・表示・繰り返し)という仕組みで動作しています。標準ライブラリのcodeモジュールを利用すると、Pythonスクリプトの中からこのREPL環境を簡単に構築できます。 codeモジュールで定義されている2つのクラス InteractiveInterpreter: ソースコードの解析とインタプリタの状態(ユーザーの名前空間)を管理するクラスです。 InteractiveConsole: 対話型Pythonインタプリタの動作を忠実に再現するクラスです。 便利な関数 interact(): read