java - 将无符号长整数转换为 BigInteger 的最简单方法是什么
问题描述
Java 不支持无符号长整数,但如果您将长整数视为无符号并进行乘法运算,它就可以正常工作。为了比较,您可以使用Long.compareUnsigned()
.
当我做
long v = Long.MAX_VALUE; //2^63
v = v+1;
BigInteger vv = BigInteger.valueOf(v);
System.out.println(vv);//this prints -1
我发现的唯一方法是做
long v = Long.MAX_VALUE; //2^63
v = v+1;
BigInteger vv = new BigInteger(Long.toUnsignedString(v));
System.out.println(vv);//this prints 2^63+1
解决方案
利用您对 2 的补码运算如何工作的知识,您可以执行以下操作:
private final BigInteger TWO_POW_64 = BigInteger.TWO.pow(64);
...
Long v = <some negative value to be treated as unsigned>;
BigInteger b = BigInteger.valueOf(v).mod(TWO_POW_64);
推荐阅读
- flutter - 离屏flutter_swiper幻灯片布局,堆栈/定位小部件
- c - int 数据类型的意外输出
- spring-boot - 在 Spring Boot Web 应用程序中编译 LESS 文件的推荐方法是什么?
- python - 如何匹配没有元音的单词?
- python - 你将如何提取或切片这样的字符串?
- c# - 使用多种图像类型并合并为 1 个 tiff 的策略
- python - 如何直接引用嵌套的 JSON 数据?
- c# - 使用变量调用方法
- java - 如何使用editText以(mm:ss)格式设置可变持续时间计时器?
- python - 为在子进程中运行的 python 功能测试运行假 redis