Java从二进制转换为八进制

时间:2011-03-16 06:21:14

标签: java

所以我有这个代码用于将二进制转换为八进制。我想转换最多64位的二进制文件,但它不起作用。

我该怎么办?

String result=""; 
int i; 
long a[]=new long[100]; 
String input="11111111111111111111111111111111111111111111111";
i=0;
for(i=input.length();i>0;i-=3){
    a[i]=Long.parseLong(input.substring(i-3,i));
    if(a[i]==0) result+="0";
    else if(a[i] == 1) result += "1";
    else if(a[i]==10) result+="2";
    else if(a[i]==11) result+="3";
    else if(a[i]==100) result+="4";
    else if(a[i]==101) result+="5";
    else if(a[i]==110) result+="6";
    else if(a[i]==111) result+="7";
}
System.out.print(result);

4 个答案:

答案 0 :(得分:3)

简单的方法如下:

long l = Long.parseLong(input, 2);
System.out.println(Long.toOctalString(l));

可能使用try / catch来处理parseLong可能抛出的NumberFormatException。


如果目的是使你的代码(某种程度)有效,那么我可以看到一些错误:

  • 您正在向后构建结果字符串。
  • 您不需要长阵列。只需一个人就可以了。
  • 您没有正确处理最左边的数字。看起来循环的最后一次尝试用负的'from'参数调用substring ...你会得到一个异常。

因为这是HOMEWORK(我推断)......我不打算告诉你如何修复代码。以上提示足以让您自己完成。

答案 1 :(得分:0)

我还没有对此进行过测试,但它或其它关闭应该可以解决这个问题:

String result = Integer.toOctalString(Integer.parseInt(input, 2));

答案 2 :(得分:0)

作为使用内置函数的替代方法,如parseLong(你似乎已经使用了,但显然不允许)我建议将字符串填充为三位数的倍数(使用模数运算符确定适当的填充量),然后迭代每个三位数部分并进行字符串比较(类似于您现有的长比较)以确定适当的输出字符。这种解决方案效率很低,但至少可以避免使用过多的内置函数。

答案 3 :(得分:0)

Try this code.

public class Octal {

    final static char[] octals = {
        '0', '1', '2', '3', '4', '5', '6', '7'
    };

    public static String toOctalString(long l) {
        long val = l;
        char[] buf = new char[64];
        int pos = 64;
        do {
            buf[--pos] = octals[(int) (val & 0x07)];
            val >>>= 3;
        } while (val != 0);
        return new String(buf, pos, (64 - pos));
    }

    public static long toDecimal(String binary) {
        // input validation and null checks are omitted
        char buf[] = binary.toCharArray();
        long l = 0;
        int shift = 0;
        for (int i = buf.length - 1; i >= 0; i--)
            l += ((buf[i] - '0') << shift++);

        return l;
    }

    public static void main(String[] args) {
            System.out.println(toOctalString(toDecimal("1000111010111")));
    }
}