【Java】平衡三進数変換をする 
2016/06/13 Mon [edit]
今回は「基数変換」で作ったライブラリを少し改造して「平衡3進数」に変換する関数を作ってみよう。
例によってWikipediaの英文ページの方が変換方法など色々載っているのだが、こちらのサイトに日本語で非常にわかりやすく書かれてあった。実際に私はこのサイトの説明を読んで実装した(と言ってもほんの少し改造したに過ぎないが(笑)。それでも詳しい説明で助かったのは本当)。それでは以前のコードとあまり変わらないが、サンプルを見てみよう。
(参考)
・平衡三進法
●平衡三進数変換
import java.util.ArrayList;
import java.util.List;
/**<h1>平衡三進数(正の数)への基数変換したリストを作る</h1>
* <p>各桁の値は、下位から上位に向かって入る。</p>
* @param value : 元の数値 (10進数)
* @return<b>List<Integer></b> : 平衡三進数(正の数)への基数分解したリスト
*/
static final List<Integer> baseRemainderBalancedTernary(int value) {
final int radix = 3;
final List<Integer> list = new ArrayList<Integer>();
int m;
do {
m = (value + 1) % radix - 1; //※この計算法は整数のみ
value = (value + 1) / radix;
list.add(m);
} while (value > 0);
return list;
}
//メインでは...
final String neg = "T"; //「-1」の文字列表現
int n = 26;
for (int i = 0; i <= n; i++) {
System.out.print("i = " + i + " -> " + Integer.toString(i, 3) + " (3)"); //普通の3進数
List<Integer> list = baseRemainderBalancedTernary(i);
String s = "";
int len = list.size();
for (int j = len - 1; j >= 0; j--) { //逆向き
int v = list.get(j);
s += (v == -1) ? neg : String.valueOf(v); //文字列化する
}
System.out.println(", " + s + " (Bal3)"); //平衡3進数
}
i = 1 -> 1 (3), 1 (Bal3)
i = 2 -> 2 (3), 1T (Bal3)
i = 3 -> 10 (3), 10 (Bal3)
i = 4 -> 11 (3), 11 (Bal3)
i = 5 -> 12 (3), 1TT (Bal3)
i = 6 -> 20 (3), 1T0 (Bal3)
i = 7 -> 21 (3), 1T1 (Bal3)
i = 8 -> 22 (3), 10T (Bal3)
i = 9 -> 100 (3), 100 (Bal3)
i = 10 -> 101 (3), 101 (Bal3)
i = 11 -> 102 (3), 11T (Bal3)
i = 12 -> 110 (3), 110 (Bal3)
i = 13 -> 111 (3), 111 (Bal3)
i = 14 -> 112 (3), 1TTT (Bal3)
i = 15 -> 120 (3), 1TT0 (Bal3)
i = 16 -> 121 (3), 1TT1 (Bal3)
i = 17 -> 122 (3), 1T0T (Bal3)
i = 18 -> 200 (3), 1T00 (Bal3)
i = 19 -> 201 (3), 1T01 (Bal3)
i = 20 -> 202 (3), 1T1T (Bal3)
i = 21 -> 210 (3), 1T10 (Bal3)
i = 22 -> 211 (3), 1T11 (Bal3)
i = 23 -> 212 (3), 10TT (Bal3)
i = 24 -> 220 (3), 10T0 (Bal3)
i = 25 -> 221 (3), 10T1 (Bal3)
i = 26 -> 222 (3), 100T (Bal3)
平衡三進数では負の重みも持つので、各桁に「-1」をが入ることがあるが、今回はこれを文字列表現で「T」としている。これは解説によって「I」とか「A」とかになってたりするので、適当に替えてしまっても構わない。実際の各桁の値は「baseRemainderBalancedTernary()」の戻値のリストを表示してみれば、負の値が入っていることもわかる。
int n = 25;
List<Integer> list = baseRemainderBalancedTernary(n);
for (int k : list) {
System.out.print(k + " ");
}
これは 10進数の 25 を平衡三進数の 10T1 (逆向きに読む [各桁は下位→上位に入っている])という意味になる。
たぶんもう少し改造すれば「平衡五進法」や「平衡七進法」もできそうだが、Wikipedia でも「同様の考え方を拡張すれば~」くらいしか書いてないので、需要はあまりなさそうだ。よってどなたかにおまかせしよう(笑)。
(関連記事)
【Java】n進数変換(基数変換)・桁の分割をする
【Java】グレイコード変換をする
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/218-4a314a6d
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |