gpt4 book ai didi

java - 在java中通过位移位将long减少为整数

转载 作者:行者123 更新时间:2023-12-01 19:42:34 25 4
gpt4 key购买 nike

我的用例是这样的,

我希望通过下移将像97173329791011L这样的极长数字减少为较小的整数,并能够取回长数字97173329791011L > 通过向上移位从较小的整数开始。我实现了一个名为 reduceLong 的函数来实现此功能,如下所示

private int reduceLong(long reduceable) {
return (int) (reduceable >> 32);
}

但是,我觉得我的功能有问题,因为产生的结果不正确。这是尝试将 97173329791011L 减少为较小的整数

时控制台输出的结果
Trying to reduce 97173329791011L
Result= 0

我们将非常感谢您的帮助。非常感谢。

最佳答案

int 数据类型可以保存 [-2^31, +2^31-1] 范围内的所有整数值(含)。十进制表示为 [-2147483648, 2147483647]。总范围涵盖 2^32 个不同的数字,这是有道理的,因为整数在内存中是 32 位。就像火柴盒中无法存储大象一样,32 位数据中也无法存储无限量的数据。您最多可以存储... 32 位的数据。

3706111600L 是一个长;它(稍微)超出了 int 的范围。在二进制中,它是:

11011100111001101100011001110000

您建议如何将这些 64 位存储为 32 位?这里没有通用策略,这在数学上是不可能的:您可以在 long 中存储 2^64 个不同的数字,这比 2^32 更独特,所以无论您建议什么“压缩”算法,它都无法工作除了最多 2^32 个唯一的 long 值,这只是其中的极少数。

除此之外,运行您的代码片段:首先,您执行 11011100111001101100011001110000 >> 32,这会删除所有位。 (那里正好有 32 位),这就是为什么你得到 0。

也许您想要这种“压缩”算法:我们在该方案中规定的 2^32 长整数是:

从 0 到 2^31-1 的所有长整型,通过将它们映射到相同的整数值,然后通过按位映射它们紧随其后的另一批 2^31 长整型,不过,考虑到在 java 中所有数字都有符号,然后映射到负整数。所有其他长整型值(因此所有高于 2^32-1 的值和所有负长整型)无法映射(或者如果您尝试,它们会取消映射到错误的值)。

如果你想要这样,你需要做的就是:

int longToInt = (int) theLong;
long backToLong = 0xFFFFFFFFL & theLong;

通常,如果您将 int 转换为 long,它会“符号扩展”,用 1 填充前 32 位,以表示您的 int 为负数。按位 & 运算将顶部 32 位全部清除为 0,然后您将返回到原始状态...IF 原始 long 在顶部有 32 个零位(3706111600L 就是这样)。

关于java - 在java中通过位移位将long减少为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54828724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com