如何在不转换为字符串的情况下将基数为 10 的长数转换为基数 9?
6 回答
FWIW,所有值实际上都在您的机器内以 2 为底(我打赌您已经知道了)。它只显示为以 10 为基数,因为字符串转换以 10 为基数创建字符串表示形式(例如,当您打印时),因为诸如parseLong
假设输入字符串以 10 为基数的方法,并且当您实际编写时编译器期望所有文字都以 10 为基数代码。换句话说,一切都是二进制的,为了我们人类的方便,计算机只将东西转换为以 10 为基数。
因此,我们应该能够轻松地将输出基数更改为 10 以外的值,从而获得以 9 为基数的相同值的字符串表示形式。在 Java 中,这是通过将可选的额外基数参数传递给Long.toString
方法来完成的。
long x=10;
System.out.println(Long.toString(x,9));
Long base10 = 10;
Long.valueOf(base10.toString(), 9);
“在不转换为字符串的情况下转换为基数 9”实际上是什么意思?
Base-9、base-10、base-2(二进制)、base-16(十六进制)只是表示数字的方式。值本身并不取决于您如何表示它。就编译器而言,int x = 256
完全一样。int x = 0xff
如果您不想“转换为字符串”(我认为这意味着您不关心值的表示),那么您到底想做什么?
如果不转换为字符串,则无法转换为 base 9。
当你写
Long a = 123;
您正在隐含假设它以 10 为底。如果您想将其解释为以 9 为底的数字,那很好,但是 Java(或我所知道的任何其他语言)不可能突然以这种方式看待它并且所以 8+1 将返回 9 而不是 10。对基数 2、8、16 和 10 有本机支持,但对于任何其他基数,您必须将其视为字符串。(然后,如果你确定你想要这个,把它转换回长)
您必须通过应用重复的模运算来应用将数字从一个基数转换为另一个基数的算法。在此处查找Java 实现。我在这里报告在该站点上找到的代码。变量M
必须包含要转换的数字,并且N
是新的基数。警告:要使代码段正常工作,N>=1 && N<=10
必须为真。扩展名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());
}