我希望存储4个无符号值,一个布尔值(或整数),两个整数最多(包括)64和一个整数,可以存储至少100,000。到一个哈希。
使用我找到的信息here
我可以在2到4个整数之间进行编码和解码,最大值为255,如此
static int encode(int a, int b, int c, int d) {
return a & 0xff | (b << 8) | (c << 16) + (d << 24);
}
static int[] decode(int encoded) {
return new int[] {
encoded & 0xff,
(encoded >> 8 & 0xff),
(encoded >> 16 & 0xff),
(encoded >> 24 & 0xff)
};
}
使用找到的信息here 我可以编码和解码两个32位整数。
long hash = (long) a << 32 | b & 0xFFFFFFFFL;
int aBack = (int) (hash >> 32);
int bBack = (int) hash;
我只是不理解按位运算符,以便弄清楚如何混合和匹配来存储不同大小的整数。
如何使用位掩码将不同大小的4个整数编码为一个整数并返回?
答案 0 :(得分:1)
我不会将其称为哈希,因为它的设计是可逆的,但它可以用作哈希。
为部件分配一些位置,例如(我现在已经将中间部分分别设为7位,因为它们显然达到并包括64位):
a
(位0)b
(第1至7位)c
(第8至14位)d
(15至31)我会假设所有的值都是非负的,因为它看起来像你的意思(例如只指定上限)。
要进行编码,请将其偏移的每个字段移位并组合,例如:
int res = a | (b << 1) | (c << 8) | (d << 15);
要进行解码,请将右移移位字段偏移和掩码:
a = x & 1;
b = (x >> 1) & 0x7F;
c = (x >> 8) & 0x7F;
d = (x >> 15) & 0x1FFFF;
d
有17位可用,这对于它的范围来说已经足够了。对于d
的较高值,res
将为负数。