简体   繁体   English

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

[英]Binary and Hex negative numbers in Java

I have this program to print out a number in any base but I'm just wondering how I can make it print negative numbers in say binary or hex. 我有这个程序可以打印任何基数的数字,但是我只是想知道如何使它以二进制或十六进制的形式显示负数。 The method is called printInt and it just returns 0 when I try to print a negative number in binary and it throws a StringIndexOutOfBoundsException exception for hex input. 该方法称为printInt ,当我尝试以二进制形式打印负数时,它仅返回0,并为十六进制输入抛出StringIndexOutOfBoundsException异常。 Here is the code: 这是代码:

import java.util.Scanner;

public class Nums {


    public static final String DIGIT_TABLE = "0123456789abcdef";


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

      //prints n in decimal form
      /*public static void printDecimal(long n){
        if(n >= 10){
            printDecimal(n / 10);      

        }
        System.out.print((char) ('0' + (n%10)) + " ");
      }*/

      public static void main(String[] args) {

          Scanner s = new Scanner(System.in);
          System.out.println("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 ");
          long input1 = s.nextLong();
          long input2 = s.nextLong();
          int input3 = s.nextInt();
          long in4 = s.nextLong();
          int in5 = s.nextInt();
            System.out.println("Prints number in decimal form");
            //printDecimal(input1);
            System.out.println();
            System.out.println("Prints number in binary: ");
            printInt(input2, input3);
            System.out.println();
            System.out.println("Number in hex");
            printInt(in4, in5);
    }
}

Add an if statement in your printInt method to take care of a negative number: 在您的printInt方法中添加一个if语句来处理负数:

//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)));
}

Sample session with this change: 带有此更改的示例会话:

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

Corner case: This will not work with the number -9 223 372 036 854 775 808, the minimal long value, because a long cannot hold the corresponding positive value. 极端情况:这不适用于最小的long值-9 223 372 036 854 775 808,因为long无法容纳相应的正值。 I think the correct solution is input validation. 我认为正确的解决方案是输入验证。 For example, require that long values are in the range -1 000 000 000 000 000 000 through 1 000 000 000 000 000 000 and bases are within 2 through 16. 例如,要求long值的范围是-1 000000000000000000000到1000000000000000000,基数必须在2到16之间。

Be simple! 很简单!

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

Pay attention, like formally there's no eg negative binary or hex numbers. 注意,像形式上一样,没有负数或十六进制数。 They are written in special form. 它们以特殊形式编写。 But in this case you have to know the size of variable. 但是在这种情况下,您必须知道变量的大小。


A would recommend not to use System.out.println() . A建议不要使用System.out.println() It's is better to build and return a string and then, client could could print it. 最好构建并返回一个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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM