当前位置: 首页 > 知识库问答 >
问题:

BigInteger.longValue()是否保证为2^63

穆商震
2023-03-14

我想做的是将一个 64 位无符号整数存储为 Long 类型,保留其间隔二进制表示形式。

例如,我想保存

2^63-1=9223372036854775807(9223372036854775807)(2^63-1

2^63 = 9223372036854775808 = 10000000 000000000000000000000000000000000 000000000000(2) as-922337203685475808 < br >因为10000000000

同样,我想将2^64-1=18446744073709551615保存为-1
,因为(无符号)18446744073009551615=0xFFFFFFFFFFFFF和(长符号)-1=0xFFFFFFFFFFFFFFFF

JavaDoc for < code > big integer . long value()表示

将此BigInteger转换为long类型。这种转换类似于Java语言规范第5.1.3节中定义的从long到int的收缩原语转换:如果这个BigInteger太大而不适合long,则只返回低位64位。请注意,这种转换可能会丢失有关BigInteger值的整体大小的信息,并返回带有相反符号的结果。

然而,我不确定它是否能像我预期的那样工作。

将<code>BigInteger(字符串)。longValue()就足够了,其中string是原始整数的字符串表示形式?

更新:我使用的是JDK1.7,所以Long。parseUnsignedLong()不可用。

共有2个答案

李兴庆
2023-03-14

您应该在 Long 类中使用无符号的长方法。

String s = "18446744073709551615"; // 2^64 - 1
long value = Long.parseUnsignedLong(s);
System.out.println("long value = " + value);
System.out.println("unsigned long value = " + Long.toUnsignedString(value));

结果

long value = -1
unsigned long value = 18446744073709551615
祁曦哲
2023-03-14

在这种情况下,我只是运行代码,看看会发生什么。

println(new BigInteger("2").pow(63).longValue());
println(new BigInteger("2").pow(63).subtract(new BigInteger("1")).longValue());
println(new BigInteger("2").pow(64).longValue());
println(new BigInteger("2").pow(64).subtract(new BigInteger("1")).longValue());

输出

-9223372036854775808
9223372036854775807
0
-1

是的,BigInteger。longValue()完全按照您的想法执行(根据文档的阅读,这是保证的行为。AKA,它被转换为位数组,只有低64位被保留并用作长值,忽略了第64位实际上是符号位的事实)。

 类似资料:
  • 问题内容: 在下面的程序中,如果执行了此程序(例如,通过命令行),则是否可以单独确保args JVM不为null? 问题答案: 简短的回答:是的,它的长度可能为0,但不会为null。

  • 问题内容: 我真的是在这里指身份平等。 例如,以下内容将始终打印 true 吗? 问题答案: 是的,类令牌是唯一的(对于任何给定的类加载器而言)。 即,您将始终 在相同的类加载器领域中 获得对相同物理对象的引用。但是,不同的类加载器将加载不同的类令牌,同时,当两个不同的类加载器加载相同的类定义时,会将相同的类定义视为不同。

  • 问题内容: 我正在将一个最初为Win32 API编写的游戏移植到Linux(很好,是将Win32端口的OS X端口移植到Linux)。 自程序启动以来,我已经通过提供uSeconds来实现: 再加上恒定的1000000作为频率,可以 在我的机器上 很好地工作,并为我提供了一个自程序启动以来包含的64位变量。 这 是便携式的吗? 我不想发现以某种方式或类似方式编译内核时,它的工作原理有所不同。我可以

  • 问题内容: 考虑以下代码: 当第一个URL够用时会被要求输入第二个URL吗? 我尝试了一个较小的示例,它看起来像预期的那样工作。即一个一个地处理数据,但是可以依靠这种行为吗?如果没有,在帮助之前打电话吗? 输出: 更新 :如果对实施很重要,请使用官方Oracle JDK8 答案 :根据下面的评论和答案,flatmap部分是惰性的。即完全读取第一个流,并且仅在需要时才读取下一个。渴望读取一个流,但是

  • 我正在搜索动觉数据流的文档,但我找不到像 动情保证至少一次交付 从生产者方面,我预计发送的消息会传播到多个节点(类似于Kafka的ack=all)从消费者方面,我预计在消费者成功处理时会有相当于Kafka提交偏移量的东西,或者类似于Google Cloud的Pub/Sub消息确认。 是否有动觉提交信息保证?是否有动觉处理保证(如果已处理并确认已处理,则将消息标记为只读)

  • 问题内容: 众所周知,JavaScript在所有现代浏览器实现中都是单线程的,但是它是在任何标准中指定的,还是仅根据传统?假设JavaScript始终是单线程的,是否完全安全? 问题答案: 这是个好问题。我很想说“是”。我不能 通常认为JavaScript具有脚本(*)可见的单个执行线程,因此,当您输入内联脚本,事件侦听器或超时时,您将完全处于控制状态,直到从块或函数的结尾返回为止。 (*:忽略浏