2017-09-24 80 views
1

我正在寻找存储4个无符号值,一个布尔(或整数),两个整数与最大(包括)64和一个整数,可以存储至少100,000。成一个单一的散列。Java位掩码编码差异大小的多个整数

使用信息我发现here

我可以编码和解码2之间 - 与255的最大整数的4像这样

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

布尔值为1位,64位可以存储在6位,100,000位需要17位。最多可以添加30位,因此看起来可以工作。 – markspace

+0

@markspace如果值是非负值,则为true。 – user949300

+0

@ user949300是的,幸运的是,在我使用的场景中,他们只需要进行未签名。 – Greg

回答

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将是负值。

+0

是的,包括64和0.谢谢你的术语澄清,有没有一个字我应该使用呢?你给你的各种资源命名,对它有什么意义? 为了说明一下,在你的例子中,你将每个值移动前一个值的总位数? a是1位,b是移位1,b是6位,c是移位7等... 所以把中间值增加到7位。我做了| (b << 1)| (c << 8)| (d << 14),然后将两个AND运算符增加到0x4F,但测试意味着D的值为+1? – Greg

+1

@Greg 7位掩码为0x7F,位移应为8和15(字段c也是7位,因此会增加一位)。名字真的没有意义。 – harold