Java位掩码编码不同大小的多个整数

时间:2017-09-24 15:47:53

标签: java hash bit-manipulation

我希望存储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个整数编码为一个整数并返回?

1 个答案:

答案 0 :(得分:1)

我不会将其称为哈希,因为它的设计是可逆的,但它可以用作哈希。

为部件分配一些位置,例如(我现在已经将中间部分分别设为7位,因为它们显然达到并包括64位):

  • a(位0)
  • uint7 b(第1至7位)
  • uint7 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将为负数。