Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java负BigInteger toString_Java_Tostring_Biginteger - Fatal编程技术网

Java负BigInteger toString

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 =

似乎我对Java的BigInteger有一个二的补码问题。 我有一个64位整数,其中只有msb和第二个msb设置为1,其余为0

以十进制表示,该值为:-4611686018427387904

我的应用程序的Java端将此十进制数作为字符串接收,并将其转换为BigInteger,如下所示:

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是第一位”的简化是有点简化。所以要得到十六进制表示,我需要删除减号并调整第一个十六进制字符?要得到十六进制表示,我需要删除减号并调整第一个十六进制字符?这很好,但我不能让它在二进制中工作(字符串格式从来都不好…)这很好用,但我不能用二进制文件(字符串格式从来都不好…)