Java 将多个有界整数打包为一个大整数

Java 将多个有界整数打包为一个大整数,java,integer,decode,encode,pack,Java,Integer,Decode,Encode,Pack,我必须在数据库中存储数百万个条目。每个条目由一组唯一的整数标识符标识。例如,一个值可以由一组10个整数标识符标识,每个整数标识符小于1亿 为了减小数据库的大小,我考虑使用单个32位整数值进行以下编码 Identifier 1: 0 - 100,000,000 Identifier 2: 100,000,001 - 200,000,000 . . . Identifier 10: 900,000,001 - 1,000,000,000 标识符1:0-100000000 标识符2:100000001

我必须在数据库中存储数百万个条目。每个条目由一组唯一的整数标识符标识。例如,一个值可以由一组10个整数标识符标识,每个整数标识符小于1亿

为了减小数据库的大小,我考虑使用单个32位整数值进行以下编码

Identifier 1: 0 - 100,000,000 Identifier 2: 100,000,001 - 200,000,000 . . . Identifier 10: 900,000,001 - 1,000,000,000 标识符1:0-100000000 标识符2:100000001-200000000 . . . 标识符10:900000001-1000000000 我正在使用Java。我可以写一个简单的编码/解码方法。用户代码不必知道我在获取/存储期间正在编码/解码

我想知道的是:实现这种编码/解码的最有效(最快)和推荐的方法是什么。一个简单的实现将执行大量的乘法/减法运算

是否可以使用移位(或按位操作)并选择不同的分区大小(每个段的大小仍然必须接近1亿)

我愿意接受任何建议、想法,甚至是完全不同的方案。我想利用这样一个事实,即整数标识符是有界的,可以在不明显影响性能的情况下大幅减少存储大小


编辑:我只是想补充一点,我浏览了这个论坛上发布的一些答案。一种常见的解决方案是为每个标识符拆分位。如果我对每个标识符使用2位来表示总共10个标识符,那么我的标识符范围将受到严重限制。

您可以将分段大小设置为27位,从而获得32*128 M分段。而不是42*100米

int value = 
int high = value >>> 27;
int low = value & ((1L << 27) -1);
int值=
int高=值>>>27;

int low=value&(1L您可以将分段大小设置为27位,这将为您提供32*128 M分段,而不是42*100 M分段

int value = 
int high = value >>> 27;
int low = value & ((1L << 27) -1);
int值=
int高=值>>>27;

int low=value&(1L不清楚您实际想要做什么,但听起来您想要一个整数值,每个位表示有一个特定的属性,并应用一个

32位整数可以保存32个不同的属性,64位64等。要保存更多属性,需要多个整数列


如果不是这样,我不知道你所说的“编码”是什么意思。

不清楚你到底想做什么,但听起来你想要一个整数值,每一位代表一个特定的属性,并应用一个

32位整数可以保存32个不同的属性,64位64等。要保存更多属性,需要多个整数列


如果不是这样,我不知道你所说的“编码”是什么意思。

听起来你想把多个0…100m的整数值打包成一个32位的整数?除非你忽略了一些重要信息,这些信息可以更有效地存储这些0…100m的值,否则根本没有办法做到这一点


ceil(log2(100m))=27位,这意味着您只有5个“空闲位”。

听起来您想将多个0…100m的整数值打包成一个32位整数?除非您忽略了能够更有效地存储这些0…100m值的重要信息,否则根本没有办法


ceil(log2(100m))=27位,这意味着您只有5个“空闲位”。

您必须使用2的幂才能使位移位生效。您能否举例说明这样一个编码整数的样子(以及您如何手动解码)?请使用任意ID(例如
144560000
2000158945
399888777
等)请注意,通过移位,每个id只有3个字节(如果要将10个id转换为32位)。因此每个id最多只能有8个不同的值。举个例子来说明我的问题。@Thomas:你是对的。我还没有想清楚。我只能存储10次方或类似的值。我可能无法压缩那么多。我可以在1000万分之一、1亿分之一和10亿分之一处拆分它们(将三个整数编码为一个大整数)。你必须使用2的幂才能使位移位生效。你能举例说明这样一个编码的整数是什么样子的(以及你是如何手动解码的)?请使用任意ID(如
144560000
2000158945
399888777
等)例如,请注意,通过移位,每个id只有3个字节(如果要将10个id转换为32位)。因此每个id最多只能有8个不同的值。举个例子来说明我的问题。@Thomas:你是对的。我还没有想清楚。我只能存储10次方或类似的值。我可能无法压缩那么多。我可以在1000万分之一、1亿分之一和10亿分之一处拆分它们(将三个整数编码为一个大整数)。谢谢。我还没有想清楚。谢谢。我还没有想清楚。你是对的。我正在想其他方法来减小文件大小。你是对的。我正在想其他方法来减小文件大小。