如何在Java中将非常大的十进制数转换为二进制数

fro*_*moa 5 java binary decimal

例如,我如何能够转换2^6012345678901234567890123456789012345678901234567890二进制?基本上,数字太大而无法用Java表示.

编辑:我将创建一个能够代表太大的数字的类.我只是很难确定如何将十进制转换为二进制.

Edit2:而且,我不允许使用BigDecimal,BigInteger或任何其他库,抱歉没有提前指定.

Pew*_*Pew 6

这是一个 quik& dirty(非常非常非常脏)的代码:

public class BigDec2Bin {

    public static int[] string2arrayReversed( String s )
    {
        char a[] = s.toCharArray();
        int  b[] = new int[ s.length() ];
        for( int i = 0; i < a.length; i++ )
        {
            b[a.length-1-i] = a[i] - 48;
        }
        return b;
    }

    // adds two binary numbers represented as strings
    public static String add( String s1, String s2 )
    {
        String result = "", stmp;
        int[] a1, a2;
        int ctmp, mark = 0;

        // a1 should be the longer one
        a1 = string2arrayReversed( ( s1.length() > s2.length() ? s1 : s2 ) );
        a2 = string2arrayReversed( ( s1.length() < s2.length() ? s1 : s2 ) );

        for( int i = 0; i < a1.length; i++ )
        {
            ctmp = a1[i] + ( i < a2.length ? a2[i] : 0 ) + mark;

            switch( ctmp )
            {
                default:
                case 0:
                    stmp = "0";
                    mark = 0;
                    break;
                case 1:
                    stmp = "1";
                    mark = 0;
                    break;
                case 2:
                    stmp = "0";
                    mark = 1;
                    break;
                case 3:
                    stmp = "1";
                    mark = 1;
                    break;
            }

            result = stmp + result;
        }

        if( mark > 0 ) { result = "1" + result; }

        return result;
    }

    public static String dec2bin( String s )
    {
        String result = "";

        for( int i = 0; i < s.length() ; i++ )
        {
            result = add( result + "0", result + "000" );
            result = add( result, Integer.toBinaryString( s.charAt(i) - 48 ) );
        }

        return result;
    }

    public static void main( String[] args )
    {
        String dec = "12345"; // should be 11000000111001
        System.out.println( "dec2bin( " + dec + " ) = " + dec2bin( dec ) );

        dec = "12345678901234567890123456789012345678901234567890";
        System.out.println( "dec2bin( " + dec + " ) = " + dec2bin( dec ) );
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

dec2bin(12345)= 011000000111001

DEC2BIN(12345678901234567890123456789012345678901234567890)= 10000111001001111111011000110110100110101010111110000011110010100001010100000010011001110100011110101111100011000111111100011001011011001110001111110000101011010010


我的主要想法是始终使用字符串。

add-method 将两个表示为字符串的二进制数相加
dec2bin-method 是魔法发生的地方。

请允许我解释一下:

result = add( result + "0", result + "000" );
Run Code Online (Sandbox Code Playgroud)

是将任何给定数字乘以 10 的计算。

将二进制数乘以 10 与将数字相加移位相同:

x*10 <=> x<<1 + x<<3

result = add( result, Integer.toBinaryString( s.charAt(i) - 48 ) );
Run Code Online (Sandbox Code Playgroud)

只需在结果字符串上添加下一个数字(从左到右)


基本上我正在做的是例如 1234:
0*10 + 1 = 1
1*10 + 2 = 12
12*10 + 3 = 123
123*10 + 4 = 1234

但仅限于二进制(表示为字符串)。


我希望我能帮上忙,并为我的英语不好而感到抱歉。


Bar*_*lom 0

如果您只使用整数,请使用BigInteger.toByteArray

如果没有,不幸的BigDecimal是没有这个方法。但我想你总是可以(在这两种情况下)只对数字的字符串表示形式进行 ASCII 编码,如果二进制形式只是用于传输而不是在任何地方进行计算。

  • 哦,如果这是一项作业,那么您只需找出 BigInteger 使用的底层技术:) (2认同)