Java中的二进制和十六进制负数

时间:2019-01-23 05:13:18

标签: java

我有这个程序可以打印任何基数的数字,但是我只是想知道如何使它以二进制或十六进制的形式输出负数。该方法称为List1.Add(list3); ,当我尝试以二进制形式打印负数时,它仅返回0,并为十六进制输入抛出printInt异常。 这是代码:

StringIndexOutOfBoundsException

2 个答案:

答案 0 :(得分:0)

在您的if方法中添加一个printInt语句以处理负数:

//prints nums in any base
public static void printInt(long n, int base) {
    if (n < 0) {
        System.out.print('-');
        n = -n;
    }
    if (n >= base) {
        printInt(n / base, base); 
    }
    System.out.print(DIGIT_TABLE.charAt((int) (n % base)));
}

此更改的示例会话:

Enter 5 numbers in the following order: 1 long value to see it in decimal form, a long value and a int for the base to be represented in and a long and a base for another number 
-314
-314
2
-314
16
Prints number in decimal form

Prints number in binary: 
-100111010
Number in hex
-13a

小写的情况:最小长数值-9 223 372 036 854 775 808不起作用,因为long无法保存相应的正值。我认为正确的解决方案是输入验证。例如,要求long值的范围是-1 000000000000000000000到1000000000000000000,基数必须是2到16之间。

答案 1 :(得分:0)

要简单!

public static void printInt(long n, int base) {
    System.out.println((n < 0 ? "-" : "") + Long.toUnsignedString(Math.abs(n), base));
}

请注意,例如正式没有负二进制或十六进制数。它们以特殊形式编写。但是在这种情况下,您必须知道变量的大小。


A建议不要使用System.out.println()。最好构建并返回一个string,然后客户端可以打印它。

public static String convert(long val, int radix) {
    String str = Long.toUnsignedString(Math.abs(val), radix);

    if (radix == 2)
        str = "0b" + str;
    else if (radix == 8)
        str = '0' + str;
    else if (radix == 16)
        str = "0x" + str;

    return val < 0 ? '-' + str : str;
}