[編集] BigInteger、または他の同様の非効率的な方法を含む回答は受け付けていません。答える前に実際に質問を読んでください!
Java は、厄介なことに、符号なしの数値型をサポートしていません。次の例のように、次に大きな型を使用して、byte、short、または int を unsigned に変換できます。
short s = -10;
int unsigned_short = s & 0xFFFF;
しかし、より大きな型がないため、これを long で行うことはできません。
では、signed long を「unsigned」base-X (私の場合は base-36) に変換し、元に戻すにはどうすればよいでしょうか? Long クラスにはこれらのメソッドがありますが、long を符号付きとして扱います。
おそらく何らかの操作と BigInteger を使用してそれを行うことができますが、BigInteger は信じられないほど遅く、一時的な BigInteger の作成によってゴミが作成されます。そして、私はそれらの変換をたくさん行うつもりです (と思います)。Long.toString(long i, int radix) のデフォルトの実装と同じくらい効率的なアルゴリズムが必要です。
Long.toString() のコードを適応させようとすると、次のようになります。
final int RADIX = 36;
final char[] DIGITS = { '0', ... , 'Z' };
long value = 100;
if (value == 0) {
return "0";
} else {
char[] buf = new char[13];
int charPos = 12;
long i = value;
while (i != 0) {
buf[charPos--] = DIGITS[Math.abs((int) (i % RADIX))];
i /= RADIX;
}
return new String(buf, charPos + 1, (12 - charPos));
}
しかし、Math.abs() にもかかわらず、負の値を正しく処理しません。
これが機能したら、逆変換が必要ですが、簡単になることを願っています。あなたの答えにもそれを入れてください。
[編集] 実際、Long.parseLong(String s, int radix) のコードを見たところ、Long.toString(long i, int radix) よりも複雑に見えます。