はじめに
軽くグレイコードを取得したい機会があり、Excelを使ってやってみたのでその時の方法について書きます。
グレイコードとは
10進数と2進数とグレイコードの対応表は以下の通りです。
10進数が7から8へ変わる時の、2進数とグレーコードの変化に着目してください。
2進数では各ビットが全て反転していますが、グレイコードは1つしか反転していません。
2進数とグレイコードのビットの変化をみていけばわかるように、2進数では複数ビットが反転することはあっても、グレイコードなら必ず反転するのは1ビットのみです。
| 10進数 | 2進数 | グレイコード |
|:--------:|:------:|:------------:|:-:|:-:|
| 0 | 0000 | 0000 | | |
| 1 | 0001 | 0001 | | |
| 2 | 0010 | 0011 | | |
| 3 | 0011 | 0010 | | |
| 4 | 0100 | 0110 | | |
| 5 | 0101 | 0111 | | |
| 6 | 0110 | 0101 | | |
| 7 | 0111 | 0100 | | |
| 8 | 1000 | 1100 | | |
| 9 | 1001 | 1101 | | |
| 10 | 1010 | 1111 | | |
| 11 | 1011 | 1110 | | |
| 12 | 1100 | 1010 | | |
| 13 | 1101 | 1011 | | |
| 14 | 1110 | 1001 | | |
| 15 | 1111 | 1000 | | |
グレイコードの利点
グレイコードは実際には、回転角を取得できるアブソリュートエンコーダのスリットパターンに利用されていたりします。
上述の通り、ビット反転は必ず一桁のみであるため、2進数の場合に対して読み取り誤差を低減することができます。
本編
10進数→グレイコード
=DEC2BIN(BITXOR(10進数,BITRSHIFT(10進数,1)),桁数)
グレイコード→2進数
素直にvbaで組みました。
Function gray2bin(gray As String) As String
ans = Left(gray, 1)
For i = 2 To Len(gray)
tmp = Mid(ans, i - 1, 1) Xor Mid(gray, i, 1)
ans = ans & tmp
Next i
gray2bin = ans
End Function
以下のように使えます。
=gray2bin(グレイコード)
グレイコード→10進数
=BIN2DEC(gray2bin(グレイコード))
さいごに
読んでいただきありがとうございました。
ご指摘などあれば、勉強させて頂きたいのでどんどんお願いします。