2017-09-24 76 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