0

割り当てのために、8文字の文字列(16進数)を受け取り、それを基数10に変換するプログラムを作成する必要があります。これを行うために外部クラスを使用することは許可されていません。私はそれが適切に機能していると確信しています...正の数のみ。私の問題は、負の数を表示する方法です。例として、FFFFFFFA は -6 として出力される必要があります これはこれまでの私のコードです

package hexconverter;

import java.util.*;

/**
 *
 * @author Steven
 */
public class Main {

    Scanner scanner = new Scanner(System.in);

    public void doWork() {



        System.err.println("Please enter the internal representation: ");
        String hex;
        hex = scanner.next();
        hex = hex.toUpperCase();

        long count = 1;
        long ans = 0;

        for (int i = 7; i >= 0; i--) {
            Character c = hex.charAt(i);

            if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5' && c != '6' && c != '7' && c != '8' && c != '9') {
                int num = fixLetters(c);
                ans = ans + (num * count);
                count = count * 16;
            } else {

                String s = c.toString(c);
                long num = Integer.parseInt(s);
                ans = ans + (num * count);
                count = count * 16;
            }
        }

       if (ans > 2147483647) {
            System.out.println("is negative");


       } else {
            System.out.println(ans);
       }
    }

    public int fixLetters(Character c) {
        if (c.equals('A')) {
            return 10;
        } else if (c.equals('B')) {
            return 11;
        } else if (c.equals('C')) {
            return 12;
        } else if (c.equals('D')) {
            return 13;
        } else if (c.equals('E')) {
            return 14;
        } else if (c.equals('F')) {
            return 15;
        } else {
            return 0;
        }

    }

    public static void main(String[] args) {
        // TODO code application logic here
        Main a = new Main();
        a.doWork();
    }
}

負の整数のテストは正しいと思います...それは32ビットが保持できる最大値であるため、それを超えるものはオーバーフローになるため、負になる必要があります。ここから、私はこれについてどうやって行くのか分かりません。ポインタやヒントをいただければ幸いです。数学的にそれを行う方法がない場合は、16 進数を 2 進数に変換してから 2 の補数を実行する必要があるように感じますが、どこから始めればよいかわかりません。

前もって感謝します

4

2 に答える 2

3

コードで数値が負の場合 (> 2147483647)、コード2^32から (4294967296) を減算します。次に、それを印刷します。

if (ans > 2147483647) {
        System.out.println(ans - 4294967296L);
   } else {
        System.out.println(ans);
   }
于 2011-09-28T01:56:29.680 に答える
2

32 ビットの 2 の補数バイナリ表現では、負の値は、符号なし表現の同じビット パターンの値よりも正確に 2 ^ 32 小さくなります。数値が負の可能性があることは既に確認しました。あとは 2 ^ 32 を引くだけです。

もちろん、2 ^ 32 (10 進数で 4294967296、16 進数で 0x100000000) は Java の "int" 型では表現できない値なので、"long" を使用する必要があります。

if (ans > 2147483647) {
    // System.out.println("is negative");
    ans = ans - 0x100000000L;
    System.out.println(ans);
} else {
于 2011-09-28T02:01:59.580 に答える