2017-09-24 8 views
1

符号なしの値4個、ブール値(または整数)2個、最大64個の整数2個、最小値100,000個の整数1個を格納します。単一のハッシュに変換します。 I 2との間の符号化及び復号化することができる私はhere複数の異なる整数の符号化を行うJavaビットマスク

を発見した情報を使用して

- そう

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) 
    }; 
} 

情報を使用してのような255の最大で4整数のは、私は2つの32を符号化し、復号化することができるhere を発見しましたビット整数。

long hash = (long) a << 32 | b & 0xFFFFFFFFL; 
int aBack = (int) (hash >> 32); 
int bBack = (int) hash; 

さまざまなサイズの整数を格納する方法をミックスしてどのように一致させるかを理解するにはビット演算子を十分に理解できません。

ビットマスクを使用して、異なるサイズの4つの整数を1つの整数にエンコードして戻すにはどうすればよいですか?

+1

ブール値は1ビット、64ビットは6ビット、100000ビットは17ビットが必要です。最大30ビットを追加して動作するように見えます。 – markspace

+0

@markspace値が負でない場合はtrue。 – user949300

+0

@ user949300はい、ありがたいことに、私が使用しているシナリオでは、署名が必要なだけです。 – Greg

答えて

1

リバーシブルになるように設計されているため、これはハッシュとは限りませんが、ハッシュとして使用できます。

(彼らは明らかに上がると64を含むので、私は、真ん中の部分今7ビットずつ作りました)は、例えば、部品のいくつかの位置を割り当てます。

  • ビットa(ビット0)
  • uint7 b(ビット1~7)
  • uint7 c(ビット8〜14)(31 15〜)
  • 残りd

すべての値は、あなたが意味するように見えるので(例えば、上限を指定するなど)、負でないことを前提とします。符号化するために

は、例えば、オフセットそのによって残さすべてのフィールドをシフトと組み合わせる:

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)、2つのAND演算子を0x4Fに増やしましたが、Dというテストは値+1を意味しますか? – Greg

+1

@ Greg 7ビットのマスクは0x7Fとなり、シフトは8と15でなければなりません(フィールドcも7ビットなので余分なビットが追加されます)。名前には意味がありません。 – harold

関連する問題