长于 Long 的整数的任何数据类型?

问题描述

我想将二进制转换为整数,乘以 17,然后再将其转换回二进制。这是我的代码:

Scanner scan = new Scanner(System.in);
String n = scan.nextLine();
long j = Long.parseLong(n,2);
j = j * 17;
System.out.println(Long.toBinaryString(j));

我最初将 j 设为 int,但在获得更大的测试用例后更改了它:

10001111110001000101000001000100111100110101100011000011011001111000100110110000110101110101100001001100010111000101000100010010011000000010010

它有一个 NumberFormatException,这是有道理的,因为 longs 只能存储有限数量的数字,那么对于很长的整数是否有任何数据类型?

解决方法

您是否尝试过 BigInteger 或 BigDecimal。

https://www.baeldung.com/java-bigdecimal-biginteger

这两种类型专门用于需要数字具有较大或任意范围的情况,例如某个值 > 或 = 到 1x10^307 且小于 1x10^-307

public void whenBigDecimalCreated_thenValueMatches() {
    BigDecimal bdFromString = new BigDecimal("0.1");
    BigDecimal bdFromCharArray = new BigDecimal(new char[] {'3','.','1','6','5'});
    BigDecimal bdlFromInt = new BigDecimal(42);
    BigDecimal bdFromLong = new BigDecimal(123412345678901L);
    BigInteger bigInteger = BigInteger.probablePrime(100,new Random());
    BigDecimal bdFromBigInteger = new BigDecimal(bigInteger);
        
    assertEquals("0.1",bdFromString.toString());
    assertEquals("3.1615",bdFromCharArray.toString());
    assertEquals("42",bdlFromInt.toString());
    assertEquals("123412345678901",bdFromLong.toString());
    assertEquals(bigInteger.toString(),bdFromBigInteger.toString());
}

那应该对你有帮助。

,

当计算超过 long 的容量时使用 BigInteger,例如

String input = "10001111110001000101000001000100111100110101100011000011011001111000100110110000110101110101100001001100010111000101000100010010011000000010010";

// parse binary string
BigInteger num1 = new BigInteger(input,2);

// multiply by 17
BigInteger num2 = num1.multiply(BigInteger.valueOf(17));

// format as binary string
String output = num2.toString(2);

System.out.println(output);

输出

100110001100000010010101010010010100001010001110010011111001111000000010010010111110010011001101110100010010001000010110001000111000011000100110010
,

例如:

import org.junit.Test;

import java.util.function.Function;

public class BinTest
{
    String binNo1 = "100011111100010001010000010001001111001101011000";
    String binNo2 = "10001111110001000101000001000100111100110101100011000011011001111000100110110000110101110101100001001100010111000101000100010010011000000010010";

    @Test
    public void testIt()
    {
        //System.out.println( bin17A( binNo1 ) );
        System.out.println( bin17S( binNo2 ) );
    }



    public static String bin17S( String bin )
    {
        // * 16
        String bin16 = bin + "0000";
        String bin01 = "0000" + bin;
        StringBuilder result = new StringBuilder();

        Function<Character,Integer> parser = c -> (c == '1') ? 1 : 0;

        int carry = 0;
        for ( int i = bin16.length() - 1; i >= 0; i-- )
        {
            int value = parser.apply( bin16.charAt( i ) )
                    + parser.apply( bin01.charAt( i ) )
                    + carry;

            carry = value / 2;

            result.insert(0,value % 2 );
        }
        while (carry > 0)
        {
            result.insert(0,carry % 2 );
            carry = carry / 2;
        }
        return result.toString();
    }


    public static String bin17A( String bin )
    {
        long j = Long.parseLong( bin,2 );
        j = j * 17;
        return Long.toBinaryString( j );
    }

}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...