我的用例是这样,我希望通过移动97173329791011L将down这样的超长数字减少为较小的整数,并通过移动97173329791011L能够从较小的整数中获取长数字up。我实现了一个名为来实现,如下所示private int reduceLong(long reduceable) { return (int) (reduceable >> 32); }但是,我感觉到我拥有的功能有问题,因为生成的结果不正确。这是尝试将reduceLong减小为较小整数时控制台输出的结果Trying to reduce 97173329791011LResult= 0您的帮助将不胜感激。非常感谢。 最佳答案 int数据类型可以保存[-2 ^ 31,+ 2 ^ 31-1](包括)范围内的所有整数值。以十进制表示,即[-2147483648、2147483647]。总范围涵盖2 ^ 32个不同的数字,这是有道理的,因为int是内存中的32位。就像您不能在火柴盒中存储大象一样,您也无法在32位数据中存储无限量的数据。您最多可以存储32位数据。3706111600L长; (略微)在int的范围之外。用二进制表示:11011100111001101100011001110000您如何建议将这64位存储为仅32位?这里没有通用的策略,在数学上不可能有这样的策略:您可以长时间存储正好2 ^ 64个不同的数字,并且比2 ^ 32的唯一值更多,因此无论您建议使用哪种“压缩”算法,都无法使用除了最多2 ^ 32个唯一的long值之外,这只是其中的一小部分。与此不同的是,运行您的代码段:首先,执行11011100111001101100011001110000 >> 32,它将除去所有位。 (那里恰好有32位),因此为什么要得到0。也许您想要这种“压缩”算法:我们认为在该方案中可表示的2 ^ 32长为:从0到2 ^ 31-1的所有long,方法是将它们映射到相同的整数值,然后再批处理2 ^ 31 long,通过按位映射将它们紧随其后,尽管考虑到java中的所有数字都是签名,然后将它们映射为负整数。所有其他长值(因此,所有高于2 ^ 32-1的值和所有负长值)都无法映射(或者,如果尝试这样做,它们将取消映射到错误的值)。如果需要,您需要做的所有事情:int longToInt = (int) theLong;long backToLong = 0xFFFFFFFFL & theLong;通常,如果将int强制转换为long,则它会“符号扩展”,用1填充最高的32位,以表示int为负数。按位&运算将前32位全部清除为0,然后返回到原始...如果原始long在顶部具有32个零位(3706111600L这样做)。关于java - 通过位移将Java中的long减少为整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54828724/
10-11 22:55
查看更多