【发布时间】:2013-08-14 18:49:19
【问题描述】:
很明显java没有'unsigned long'类型,而我们可以使用long来存储无符号数据。那么如何将其转换为字符串或仅以“无符号”方式打印?
【问题讨论】:
-
“以未签名方式打印”是什么意思?
标签: java long-integer
很明显java没有'unsigned long'类型,而我们可以使用long来存储无符号数据。那么如何将其转换为字符串或仅以“无符号”方式打印?
【问题讨论】:
标签: java long-integer
long quot = (number >>> 1) / 5L; // get all digits except last one
long rem = number - quot * 10L; // get last digit with overflow trick
String out = Long.toString(quot) + rem;
【讨论】:
Long.toUnsignedString() 使用的算法相同。
正如在 SO 上的 different question 中提到的,有一种从 Java 8 开始的方法:
System.out.println(Long.toUnsignedString(Long.MAX_VALUE)); // 9223372036854775807
System.out.println(Long.toUnsignedString(Long.MIN_VALUE)); // 9223372036854775808
【讨论】:
您可以使用第三方库吗? Guava 的 UnsignedLongs.toString(long) 就是这样做的。
【讨论】:
不幸的是,您需要使用 BigInteger,或者编写自己的例程。
这是一个Unsigned 类,它有助于解决这些变通方法
private static final BigInteger BI_2_64 = BigInteger.ONE.shiftLeft(64);
public static String asString(long l) {
return l >= 0 ? String.valueOf(l) : toBigInteger(l).toString();
}
public static BigInteger toBigInteger(long l) {
final BigInteger bi = BigInteger.valueOf(l);
return l >= 0 ? bi : bi.add(BI_2_64);
}
【讨论】: