0

みなさん、こんにちは。値を2進数から16進数に変換するソリューションを実装しました。だから私は自分よりももっとエレガントな解決策があるのではないかと思っていました(確かにあります)。私はプログラムをテストしました、そしてそれは働いています。コードは次のとおりです。

public class BinaryToHex
{
    public static void main(String[] args) 
    {
        String binary = "1110001101";
        binaryToHex(binary);
        //38d
    }

    public static void binaryToHex(String binaryValue)
    {
        StringBuilder sb = new StringBuilder(binaryValue);

        System.out.println("Original StringBuilder: " + sb);
        sb.reverse();

        System.out.println("reversed StringBuilder: " + sb);

        int convert = binaryValue.length();
        System.out.println("Legth of the binary: " +  convert);

        if(convert % 4 != 0)
        {
            while(convert % 4 != 0)
            {


                sb.append(0);
                convert ++;

                System.out.println("StringBuilder in loop: " + sb);
                System.out.println("Convert in loop: " + convert);
            }
        }
        sb.reverse();
        System.out.println("Ready StringBuilder for use? " + sb);
        String test = null;
//      String test = sb.toString();
        for(int i=0; i<sb.length(); i ++)
        {
            if(i % 4 == 0)
            {
                test = sb.substring(i, (i+4));
                System.out.print(getChar(test));
            }
        }
    }

    public static String getChar(String num)
    {
        String number = "";
        switch(num)
        {
            case "0000" : number = "0"; break;
            case "0001" : number = "1"; break;
            case "0010" : number = "2"; break;
            case "0011" : number = "3"; break;
            case "0100" : number = "4"; break;
            case "0101" : number = "5"; break;
            case "0110" : number = "6"; break;
            case "0111" : number = "7"; break;
            case "1000" : number = "8"; break;
            case "1001" : number = "9"; break;
            case "1010" : number = "A"; break;
            case "1011" : number = "B"; break;
            case "1100" : number = "C"; break;
            case "1101" : number = "D"; break;
            case "1110" : number = "E"; break;
            case "1111" : number = "F"; break;

        }
        return number;
    }

}
4

5 に答える 5

2

これはどう:Integer.toHexString(Integer.valueOf(binary, 2))

于 2012-08-01T13:16:51.547 に答える
1

明らかに、簡潔さのチェックでエラーをスキップしました。

int numInDec = Integer.parseInt(binaryString, 2);
String hexString = Integer.toHexString(numInDec);

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html

編集:あなたは図書館を避けたいと思います、なぜですか?それはあなたが探している「よりエレガントな」ソリューションです。

于 2012-08-01T13:19:49.973 に答える
1

ライブラリの実装で当たり前だと思っていることを実行するのは、面白い練習でした。カウンターを使用して自分がどこにいるかを追跡し、逆の操作を防ぐことで、アルゴを大幅に改善できます。また、スイッチブロックはかなりエレガントではありません。

これが私のやり方です。高性能だとは言いませんが、提案の改善だと思います。

public class BinToHex {

    static char[] HEX = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    static int[] POW_2 = {1,2,4,8};
    public static String toHex(String bin) {
        int len = bin.length();
        char[] result = new char[(int)Math.ceil(len*1D/4)];
        int pos = result.length-1;
        int hexval = 0;
        for (int i=0; i<len;i++ ){
            hexval += (bin.charAt(len-i-1)-HEX[0]) * POW_2[i%4];
            if ((i+1)%4==0) {
                result[pos--] = HEX[hexval];
                hexval = 0;
            }
        }
        if (pos==0) {
            result[0] = HEX[hexval];
        }
        return new String(result);
    }

    public static void main(String [] param) {
        System.out.println(BinToHex.toHex("1")); // border case 1 char => 0x1
        System.out.println(BinToHex.toHex("101")); // testcase less than 4 chars => 0x5
        System.out.println(BinToHex.toHex("1011")); // testcase eq 4 chars => 0xB
        System.out.println(BinToHex.toHex("101101011011")); // testcase lenght % 4  = 0
        System.out.println(BinToHex.toHex("11101101011011")); // testcase lenght % 4  != 0
        System.out.println(BinToHex.toHex("000101101011011")); // testcase leading 0
    }

}
于 2012-08-01T15:30:58.513 に答える
1
Long.toHexString(Long.valueOf(binaryString, 2));

バイナリ文字列が 63 ビットより長い場合 ( longJava では署名されています):

new BigInteger(binaryString, 2).toString(16);
于 2012-08-01T13:16:58.253 に答える
1

を使用するのはInteger.toString(Integer.parseInt(binaryValue,2),16);どうですか?

于 2012-08-01T13:17:25.430 に答える