任何长于 Long 的整数数据类型?
Any datatype for integers longer than a 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,这是有道理的,因为 long 只能存储有限数量的数字,那么对于非常长的整数有任何数据类型吗?
你试过 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','1','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());
}
那应该对你有帮助。
例如:
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 );
}
}
当计算超出 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
我想将二进制转换为整数,乘以 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,这是有道理的,因为 long 只能存储有限数量的数字,那么对于非常长的整数有任何数据类型吗?
你试过 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','1','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());
}
那应该对你有帮助。
例如:
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 );
}
}
当计算超出 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