前説
ふと―――
こんな基数変換プログラムがあったら楽しいだろうか?
と思った
勿論、私が楽しめれば充分なんですが…
「こんな」の内訳
- 任意の基数に対応
8進でも 16進でも n進どんと来いっ - 任意の文字に対応
16進が[0-9A-F]
でなくたっていいじゃないか、だもの - option base 1 な数列に対応したい
つまりExcelの列名を表現可能って事
※ あ、「基数変換」についての解説はナシの方向で…
実装
ツールとして提供するのではなく、あくまでもロジックをお見せするだけ―――
なので、単純メソッドで諸々完結する様にしたいなぁ
てな訳で、以下
string ToRadix(int num, string Chars, int origin = 0) {
int radix = Chars.Length;
StringBuilder sb = new StringBuilder();
while (num > 0) {
int r = (num - origin) % radix;
num = (num - origin) / radix;
sb.Insert(0, Chars[r]);
}
return sb.Length == 0 ? $"{Chars[0]}" : $"{sb}";
}
int ToDecimal(string num, string Chars, int origin = 0) {
int radix = Chars.Length;
int result = 0;
for (int i = 0; i < num.Length; i++)
result = result * radix + Chars.IndexOf(num[i]) + origin;
return result;
}
それぞれ第2パラメータは数値を表現する「文字」の集合
なので、この文字列の長さが期待する「基数」になります
第3パラメータは通常省略する(既定値としては0(zero)
となる)
「1(one)
」を指定すると、自然数列(?表現が正しいか分からない)扱いとなる
が、多分Excelの列名の変換位にしか役立たないかも…
それ以上の値を指定した場合、用途(と云うか有用性?)は更に不明
序でに云うなら、上記メソッドは整合性の検査はしていませんので、変換可能な正しいデータを渡す必要があります
あ、それと符号は受け付けませんので、負数の表現や補数表記もできません
正の整数の範囲でお楽しみ頂ければ幸いで御座います
実行例
簡単なUIを持つプログラムで動作確認
お分かり頂けただろうか?
16進表記の「6f
」は10進数で「111
」
次に10進「111
」は8進で表記すると「157
」になる、事が分かる
さて、ところで、0x6f
はASCII
文字としては小文字のo
(オー)になる―――
o
は(8進で)157
…
また、O
は8進表記=Octal
を表している
つまり、O157
の存在は必然である
と云える…
なんてね
1 origin
じゃぁ、1 originの方を確認
カラム位置「XFD」は16384列目だという事で、こちらも問題なし
おまけ
任意基数字列を表現する文字集合を指定できるので…
とか
の様な変換も可能
後記
たのしゅうございました
――――――――
指折りフォントを自作すれば、自分の指を攣らせる事なく32進表記のビット列を簡単に表現できるなぁ…
32進表記のアクセスカウンタ?
それはそれで――
アリかも知れない
まだ暫く楽しめそうです