Java负BigInteger toString
似乎我对Java的BigInteger有一个二的补码问题。 我有一个64位整数,其中只有msb和第二个msb设置为1,其余为0 以十进制表示,该值为:-4611686018427387904 我的应用程序的Java端将此十进制数作为字符串接收,并将其转换为BigInteger,如下所示:Java负BigInteger toString,java,tostring,biginteger,Java,Tostring,Biginteger,似乎我对Java的BigInteger有一个二的补码问题。 我有一个64位整数,其中只有msb和第二个msb设置为1,其余为0 以十进制表示,该值为:-4611686018427387904 我的应用程序的Java端将此十进制数作为字符串接收,并将其转换为BigInteger,如下所示: BigInteger bi = new BigInteger("-4611686018427387904", 10); 然后,它需要以二进制和十六进制形式显示这个数字。 我尝试使用: String bin =
BigInteger bi = new BigInteger("-4611686018427387904", 10);
然后,它需要以二进制和十六进制形式显示这个数字。
我尝试使用:
String bin = bi.toString(2);
String hex = bi.toString(16);
但我得到了:
-100000000000000000000000000000000000000000000000000000000000000
-4000000000000000
鉴于我希望得到:
1100000000000000000000000000000000000000000000000000000000000000
c000000000000000
有什么提示吗?二进制数1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000。它等于2^63+2^62。 我不明白为什么当你转换为基数2或基数16时,你会期望一个负数变成正数
你把基数n表示法和数字的内部表示法搞混了。二进制数1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000。它等于2^63+2^62。 我不明白为什么当你转换为基数2或基数16时,你会期望一个负数变成正数 您将基数n表示法与数字的内部表示法混淆。数字始终适合64位: 如果你的数字总是适合64位,你可以把它放在一个长的,然后打印位/十六进制数字
long l = bi.longValue();
String bin = Long.toBinaryString(l);
String hex = Long.toHexString(l);
System.out.println(bin);
System.out.println(hex);
数字可能并不总是适合64位:
如果数字不总是适合64位,则必须“手动”求解。要将数字转换为其2的补码表示形式,请执行以下操作:
- 如果数字为正数,则不执行任何操作
- 如果数字为负数:
- 将其转换为绝对值
- 补位
- 加1
BigInteger
,转换如下所示:
if (bi.compareTo(BigInteger.ZERO) < 0)
bi = bi.abs().not().add(BigInteger.ONE);
if(bi.compareTo(biginger.ZERO)<0)
bi=bi.abs().not().add(biginger.ONE);
如果使用bi.toString(2)
打印它,仍然会得到符号字符,而不是前导的1
。只需将.replace('-','1')
添加到字符串即可解决此问题。数字始终适合64位:
如果你的数字总是适合64位,你可以把它放在一个长的,然后打印位/十六进制数字
long l = bi.longValue();
String bin = Long.toBinaryString(l);
String hex = Long.toHexString(l);
System.out.println(bin);
System.out.println(hex);
数字可能并不总是适合64位:
如果数字不总是适合64位,则必须“手动”求解。要将数字转换为其2的补码表示形式,请执行以下操作:
- 如果数字为正数,则不执行任何操作
- 如果数字为负数:
- 将其转换为绝对值
- 补位
- 加1
BigInteger
,转换如下所示:
if (bi.compareTo(BigInteger.ZERO) < 0)
bi = bi.abs().not().add(BigInteger.ONE);
if(bi.compareTo(biginger.ZERO)<0)
bi=bi.abs().not().add(biginger.ONE);
如果使用
bi.toString(2)
打印它,仍然会得到符号字符,而不是前导的1
。这可以通过简单地将.replace('-','1')
添加到字符串中来解决。如果数字是64位或更少,那么解决这一问题的简单方法是转换为长的,然后使用长的.tohextstring()
如果数字是64位或更少,那么解决这个问题的简单方法就是转换为long
,然后使用long.toHexString()
你的意思是什么?
你想得到二的补码吗
如果你是这个意思,也许我可以给你举个例子
import java.util.*;
public class TestBina{
static void printBinaryInt(int i){
System.out.println("int:"+i+",binary:");
System.out.print(" ");
for(int j=31;j>=0;j--)
if(((1<<j)&i)!=0)
System.out.print("1");
else
System.out.print("0");
System.out.println();
}
public static void main(String [] args){
Random rand = new Random();
int i = rand.nextInt();
int j = rand.nextInt();
printBinaryInt(i);
printBinaryInt(j);
printBinaryInt(10);
printBinaryInt(-10);
}
}
import java.util.*;
公共类TestBina{
静态无效printBinaryInt(int i){
System.out.println(“int:+i+”,二进制:);
系统输出打印(“”);
对于(int j=31;j>=0;j--)
如果你是什么意思?
你想得到二的补码吗
如果你是这个意思,也许我可以给你举个例子
import java.util.*;
public class TestBina{
static void printBinaryInt(int i){
System.out.println("int:"+i+",binary:");
System.out.print(" ");
for(int j=31;j>=0;j--)
if(((1<<j)&i)!=0)
System.out.print("1");
else
System.out.print("0");
System.out.println();
}
public static void main(String [] args){
Random rand = new Random();
int i = rand.nextInt();
int j = rand.nextInt();
printBinaryInt(i);
printBinaryInt(j);
printBinaryInt(10);
printBinaryInt(-10);
}
}
import java.util.*;
公共类TestBina{
静态无效printBinaryInt(int i){
System.out.println(“int:+i+”,二进制:);
系统输出打印(“”);
对于(int j=31;j>=0;j--)
如果(((1有一个biginger.toByteArray()
方法,该方法将biginger
的两个补码表示形式返回为byte[]
。您只需以十六进制或二进制形式打印该数组:
byte[] bs = bi.toByteArray();
for (byte b: bs) {
System.out.print(String.format("%02X", 0xff & b));
}
有一个biginger.toByteArray()
方法,它以byte[]
的形式返回biginger
的两个补码表示形式。您只需以十六进制或二进制形式打印该数组:
byte[] bs = bi.toByteArray();
for (byte b: bs) {
System.out.print(String.format("%02X", 0xff & b));
}
如果您有一个64位有符号整数,为什么要使用biginger
而不是long
?它可以大于64,所以您需要2s补码版本,但没有固定的大小?我不清楚您如何表示它。对于“-1”,您希望看到什么例如?如果您有一个64位带符号整数,为什么要使用biginger
而不是long
?它可以大于64位,所以您需要2s补码版本,但没有固定的大小?我不清楚您如何表示它。您希望看到“-1”的什么?例如,-sign是第一位是对“where-sign是第一位”的简化是有点简化。所以要得到十六进制表示,我需要删除减号并调整第一个十六进制字符?要得到十六进制表示,我需要删除减号并调整第一个十六进制字符?这很好,但我不能让它在二进制中工作(字符串格式从来都不好…)这很好用,但我不能用二进制文件(字符串格式从来都不好…)