文字列に変換せずに、基数 10 の長い数値を基数 9 に変換する方法は?
6 に答える
FWIW、すべての値は実際にはマシン内の基数 2 にあります (すでに知っているはずです)。文字列変換は基数 10 で文字列表現を作成するため (たとえば、印刷するとき)、基数 10 としてのみ表示されますparseLong
。コード。言い換えれば、すべてがバイナリであり、コンピューターは人間の便宜のために、基数 10 との間でデータを変換するだけです。
したがって、出力基数を 10 以外に簡単に変更できるため、基数 9 で同じ値の文字列表現を取得できます。Java では、オプションの追加の基数パラメーターをLong.toString
メソッドに渡すことによってこれを行います。
long x=10;
System.out.println(Long.toString(x,9));
「文字列に変換せずにベース9に変換する」とは、実際にはどういう意味ですか?
基数9、基数10、基数2(2進数)、基数16(16進数)は、数値を表すための単なる方法です。値自体は、それをどのように表現するかに依存しません。コンパイラに関する限り、int x = 256
まったく同じです。int x = 0xff
「文字列に変換」したくない場合(これは、値の表現に関係がないことを意味すると読みます)、正確に何をしたいですか?
Long base10 = 10;
Long.valueOf(base10.toString(), 9);
文字列に変換せずに基数 9 に変換することはできません。
あなたが書くとき
Long a = 123;
それを基数 9 の数値として解釈したい場合は問題ありませんが、Java (または私が知っている他の言語) が突然そのように解釈する方法はありません。したがって、8+1 は 10 ではなく 9 を返します。基数 2、8、16、および 10 はネイティブでサポートされていますが、それ以外の基数は文字列として扱う必要があります。(そして、これが確実に必要な場合は、long に変換し直してください)
モジュロ演算を繰り返し適用することにより、ある基数から別の基数に数値を変換するアルゴリズムを適用する必要があります。ここでJavaの実装を探してください。そのサイトで見つかったコードをここに報告します。変数M
には変換する数値が含まれている必要があり、N
これが新しいベースです。警告:スニペットが正しく機能するにN>=1 && N<=10
は、trueである必要があります。拡張子N>10
は関心のある読者に任されています(数字の代わりに文字を使用する必要があります)。
String Conversion(int M, int N) // return string, accept two integers
{
Stack stack = new Stack(); // create a stack
while (M >= N) // now the repetitive loop is clearly seen
{
stack.push(M mod N); // store a digit
M = M/N; // find new M
}
// now it's time to collect the digits together
String str = new String(""+M); // create a string with a single digit M
while (stack.NotEmpty())
str = str+stack.pop() // get from the stack next digit
return str;
}
文字列に変換する以外に何でもできる場合は、次のようにします。
public static long toBase(long num, int base) {
long result;
StringBuilder buffer = new StringBuilder();
buffer.append(Long.toString(num, base));
return Long.parseLong(buffer.toString());
}