グレイコードをバイナリコードに変換するPythonプログラムの書き方
グレイコード(Gray code)は、隣接する数値間でビットが1つだけ変化するように設計された特殊な二進表現です。デジタル通信やエンコーダなど、誤差を最小限に抑えたい場面で活用されます。本記事では、Pythonを使ってグレイコードを通常のバイナリコードに変換する方法を解説します。
変換の基本的な考え方は、先頭ビットはそのままコピーし、2番目以降の各ビットは「直前のバイナリ結果のビット」と「現在のグレイコードのビット」をXOR演算した値とするというものです。以下では、このロジックを実装したサンプルコードを紹介します。
サンプルコード
def flip_num(my_nu):
return '1' if(my_nu == '0') else '0'
def gray_to_binary(gray):
binary_code = ""
binary_code += gray[0]
for i in range(1, len(gray)):
if (gray[i] == '0'):
binary_code += binary_code[i - 1]
else:
binary_code += flip_num(binary_code[i - 1])
return binary_code
gray_code = "01101001"
print("The gray code is :")
print(gray_code)
print("Binary code of", gray_code, "is", gray_to_binary(gray_code))実行結果
The gray code is : 01101001 Binary code of 01101001 is 01001110
コードの解説
- まず、flip_num 関数を定義します。引数が '0' であれば '1' を、そうでなければ '0' を返す、いわゆるビット反転を行う関数です。
- 次に、gray_to_binary 関数を定義します。この関数はグレイコードの文字列を引数として受け取ります。
- グレイコードの先頭ビットはバイナリコードの先頭ビットと一致するため、そのまま
binary_codeに追加します。 - 続いて、
forループで2文字目以降を順に処理します。現在のグレイコードのビットが '0' の場合は、直前のバイナリビットをそのまま使用します。 - ビットが '1' の場合は、
flip_num関数を呼び出して直前のバイナリビットを反転させた値を使用します。 - 最後に、変換対象となるグレイコード「01101001」を定義し、関数に渡して結果を出力します。
XOR演算による別の実装例
上記のロジックは、XOR演算子を使うことでより簡潔に記述することもできます。
def gray_to_binary_xor(gray):
binary = int(gray[0], 2)
for bit in gray[1:]:
binary = binary << 1 | (int(binary & 1) ^ int(bit))
return bin(binary)[2:]
print(gray_to_binary_xor("01101001")) # 出力: 1001110どちらの方法でも同じ結果が得られますが、XORを使った実装の方が数学的な背景が明確で、大規模なデータにも対応しやすいのが特徴です。用途に応じて使い分けてください。
-
Pythonで10進数を2進数に変換する方法|再帰処理とbin()関数の実装例
この記事では、「10進数を2進数に変換する」という問題に対する解決策を、具体的なコード例とともにわかりやすく解説します。 問題の概要 問題: 与えられた10進数の整数を、それに対応する2進数表現へ変換する。 この問題を解くには、大きく分けて2つのアプローチがあります。順番に見ていきましょう。 方法1:再帰を使った実装 10進数を2進数に変換する基本的な考え方は、「数値を2で割り続け、その余りを記録する」ことです。再帰関数を使うと、除算を繰り返しながら余りを自動的に上位の桁から順に出力できます。 サンプルコード def DecimalToBinary(num): if num &g
-
Pythonで10進数を2進数に変換する方法|再帰と組み込み関数の2つのアプローチ
この記事では、10進数で表された数値を2進数に変換するPythonプログラムについて、その考え方と具体的な実装方法をわかりやすく解説します。 問題文 ある整数が与えられたとき、その数値を2進数に変換します。例えば、10進数の「35」は2進数では「100011」と表現されます。 アプローチ1:再帰を使った解法 再帰処理を利用すると、シンプルなコードで10進数を2進数に変換できます。基本的な流れは以下の擬似コードのとおりです。 DecToBin(num): if num > 1: &n