2017-10-06 20 views
0

既知のサイズで64ビットより大きいビットマスクを処理する(つまり、すべてのビット単位の操作を実行する)最も効率的なデータ構造は何ですか?java-fast 64ビットより大きいビットマスク

byte[]BigInteger?何か完全に?

は、Java 7対応する必要があり、高速である必要があります(あるいは少なくとも同じ速合理的に期待することができるよう、そのサイズ与えられた)

if(bitmask & 7 != 0){...} 

bitmask1 |= bitmask2 

などのようなもののためにに。

+0

BigIntegerのは確かにそれらのもののすべてを行うことができます。しかし、BigIntegerインスタンスは不変です。そのため、すべての操作で新しいBigIntegerオブジェクトが生成されます。パフォーマンスが許容できるかどうかを判断するために試す必要があるかもしれません。 – VGR

答えて

3

ビットマスクとして使用できるプリミティブ番号の最大サイズは実際には長い値のため64ビットなので、直接行うことはできません。ビットマスクを2つ以上のintまたはlongに分割し、手で管理することができます。

int[] mask = new int[4]; 
final int MAX_SHIFT = 32; 

void set(int b) { 
    mask[b/MAX_SHIFT] |= 1 << (b % MAX_SHIFT); 
} 

boolean isSet(int b) { 
    return (mask[b/MAX_SHIFT] & (1 << (b % MAX_SHIFT))) != 0; 
} 

それともたBitSet

を使用
BitSet bitSet = new BitSet(101); 
bitSet.set(100); 
+0

ええ、BitSetは十分速く、素晴らしい操作がいくつかあります。しかし、_shifting_ビットではありません。 –

+0

右シフトのための@JoopEggen、少なくとも、そこへの解決策があります。 https://stackoverflow.com/questions/9008150/shifting-a-java-bitset(彼らはそれを左シフトと呼んでいますが、左シフトは私のために他の方向に行きます)。左シフトの場合、私は直ちに解決策を見出すのではなく、 '' BitSet''を拡張し、格納された値を一定量だけインクリメントするメソッドを追加します。あなたは? – User1291

+0

@ User1291は、元のビットセットの部分範囲に見えますが、再索引付けされません。開始インデックスのオフセットを維持する場合は、少なくともシフトの一部(左または右にクリア)。 –

関連する問題