任何长度超过long的整数的数据类型?

9rbhqvlz  于 2021-06-26  发布在  Java
关注(0)|答案(3)|浏览(624)

我想把二进制转换成整数,乘以17,然后再转换成二进制。这是我的密码:

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

我最初做了一个int,但是当我得到一个更大的测试用例时,我改变了它:

  1. 10001111110001000101000001000100111100110101100011000011011001111000100110110000110101110101100001001100010111000101000100010010011000000010010

它有一个numberformatexception,这是有意义的,因为long只能存储有限数量的数字,所以对于非常长的整数有数据类型吗?

pinkon5k

pinkon5k1#

使用 BigInteger 当计算超过 long ,例如。

  1. String input = "10001111110001000101000001000100111100110101100011000011011001111000100110110000110101110101100001001100010111000101000100010010011000000010010";
  2. // parse binary string
  3. BigInteger num1 = new BigInteger(input, 2);
  4. // multiply by 17
  5. BigInteger num2 = num1.multiply(BigInteger.valueOf(17));
  6. // format as binary string
  7. String output = num2.toString(2);
  8. System.out.println(output);

输出

  1. 100110001100000010010101010010010100001010001110010011111001111000000010010010111110010011001101110100010010001000010110001000111000011000100110010
展开查看全部
de90aj5v

de90aj5v2#

例如:

  1. import org.junit.Test;
  2. import java.util.function.Function;
  3. public class BinTest
  4. {
  5. String binNo1 = "100011111100010001010000010001001111001101011000";
  6. String binNo2 = "10001111110001000101000001000100111100110101100011000011011001111000100110110000110101110101100001001100010111000101000100010010011000000010010";
  7. @Test
  8. public void testIt()
  9. {
  10. //System.out.println( bin17A( binNo1 ) );
  11. System.out.println( bin17S( binNo2 ) );
  12. }
  13. public static String bin17S( String bin )
  14. {
  15. // * 16
  16. String bin16 = bin + "0000";
  17. String bin01 = "0000" + bin;
  18. StringBuilder result = new StringBuilder();
  19. Function<Character, Integer> parser = c -> (c == '1') ? 1 : 0;
  20. int carry = 0;
  21. for ( int i = bin16.length() - 1; i >= 0; i-- )
  22. {
  23. int value = parser.apply( bin16.charAt( i ) )
  24. + parser.apply( bin01.charAt( i ) )
  25. + carry;
  26. carry = value / 2;
  27. result.insert(0, value % 2 );
  28. }
  29. while (carry > 0)
  30. {
  31. result.insert(0,carry % 2 );
  32. carry = carry / 2;
  33. }
  34. return result.toString();
  35. }
  36. public static String bin17A( String bin )
  37. {
  38. long j = Long.parseLong( bin, 2 );
  39. j = j * 17;
  40. return Long.toBinaryString( j );
  41. }
  42. }
展开查看全部
7z5jn7bk

7z5jn7bk3#

你试过biginteger还是bigdecimal。
https://www.baeldung.com/java-bigdecimal-biginteger
这两种类型特别适用于要求数字具有大范围或任意范围的情况,如某个值>或=到1x10^307和小于1x10^307

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

那应该对你有帮助。

展开查看全部

相关问题