3

我正在编写一个将八进制数转换为小数的程序。它编译正确,但我的转换代码有一些主要问题。对我来说这似乎是完全合乎逻辑的,但是当我运行程序时,转换错误(即 1 转换为 36)有人能指出发生了什么问题吗?

 public static int convert(int octal)
{
    int d1=0,d2=0,d3=0,d4=0,d5=0,d6=0,d7=0,d8=0;

    if(octal >=9999999){
    d8 = (octal-(octal%10000000));}
    if(octal >=999999){
    d7 = (octal-(octal%1000000));}
    if(octal >=99999){
    d6 = (octal-(octal%100000));}
    if(octal >=9999){
    d5 = (octal-(octal%10000));}
    if(octal >= 999){
    d4 = (octal-(octal%1000));}
    if(octal >= 99){
    d3 = (octal-(octal%100));}
    if(octal >= 9){
    d2 = (octal-(octal%10));}
    if(octal >= 0){
    d1 = (octal-(octal%1));}


    octal = (d8 * 8^7) + (d7 * 8^6) + (d6 * 8^5) + (d5 * 8^4) + (d4 * 8^3) + (d3 * 8^2) + (d2 * 8^1) + (d1 * 8^0);

    return octal;

}

这只是我的转换方法,我的主要方法是收集 int 八进制;

4

4 回答 4

7

这就是问题:

8^7

^操作员不会按照您的想法去做。它进行二进制异或...

但是,我想说整个设计显然是可疑的。一个int值不是“in”八进制或任何其他基数 - 它只是一个整数。数字 10 就是数字 10,无论是十进制的“10”、十六进制的“A”还是八进制的“12”。如果您有一个要解析为八进制数字的字符序列,则该方法的输入应该是 a String,而不是 a int

于 2012-10-30T16:01:06.603 回答
4

由于您的方法接受整数(通常以字符串表示形式表示为十进制),并且您输出的也是整数,因此您并没有真正变成“八进制整数”,而是将其更改为其他整数完全地。您正在尝试将整数正确转换为八进制,然后将该八进制错误地解释为十进制。

如果希望将整数转换为八进制字符串表示,您可以简单地使用以下方法:

public static String convert(int number) {
    Integer.toOctalString(number);
}

而且,如果您真的想返回一个 int 来表示该八进制字符串被解析为十进制,您可以简单地执行以下操作:

public static int convert(int number) {
    return Integer.parseInt(Integer.toOctalString(number));
}
于 2012-10-30T16:50:11.847 回答
1

如果您有重复的代码,您可能会考虑使用循环。

public static void main(String... args) {
    for (long i = 7, j = 7; i > 0; i = i * 10 + 1, j = j * 8 + 1) {
        long c = convert(i);
        if (c != j)
            throw new AssertionError(i + ": " + c + " != " + j);
        System.out.println(i + " = > " + j);
    }
}

public static long convert(long octal) {
    long ret = 0;
    for (long i = 1000000000000000000L, j = 1L << (3 * 18); i > 0; i /= 10, j >>= 3)
        ret += j * (octal / i % 10);
    return ret;
}

印刷

7 = > 7
71 = > 57
711 = > 457
7111 = > 3657
71111 = > 29257
711111 = > 234057
7111111 = > 1872457
71111111 = > 14979657
711111111 = > 119837257
7111111111 = > 958698057
71111111111 = > 7669584457
711111111111 = > 61356675657
7111111111111 = > 490853405257
71111111111111 = > 3926827242057
711111111111111 = > 31414617936457
7111111111111111 = > 251316943491657
71111111111111111 = > 2010535547933257
711111111111111111 = > 16084284383466057
7111111111111111111 = > 128674275067728457
于 2012-10-30T16:18:52.497 回答
1

你有一个潜在的误解,会一直把你搞得一团糟。

本身没有“八进制数”这样的东西。Anint不是十进制、罗马数字或八进制——它只是一个数字。

“八进制数”实际上意味着“包含数字的八进制表示的字符串”。

于 2012-10-30T22:49:00.270 回答