2017-10-06 9 views
0

Quelle est la structure de données la plus efficace pour gérer (c'est-à-dire effectuer toutes les opérations sur bits sur) les masques de bit d'une taille connue mais supérieure à 64 bits?java - masques de bits rapides de taille supérieure à 64 bits

byte[]? BigInteger? Quelque chose d'autre entièrement?

a besoin d'être Java 7 compatible et doit être rapide (ou tout au moins aussi vite que l'on peut raisonnablement attendre, compte tenu de leur taille) pour des choses comme

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

et

bitmask1 |= bitmask2 

et ainsi sur.

+0

BigInteger peut certainement faire toutes ces choses. Mais, une instance BigInteger est immuable, donc toute opération sur celle-ci produira un nouvel objet BigInteger. Vous devrez peut-être essayer pour déterminer si la performance est acceptable. – VGR

Répondre

3

Vous ne pouvez pas le faire directement car la taille maximale d'un nombre primitif pouvant être utilisé comme masque de bits est en réalité de 64 bits pour une valeur longue. Ce que vous pouvez faire est de diviser le bitmask en 2 ou plusieurs ints ou longs et ensuite le gérer à la main.

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

Ou vous utilisez un BitSet

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

Ouais, BitSet est assez rapide, et a quelques bonnes opérations. Bien que pas _shifting_ bits. –

+0

@JoopEggen pour le droit-décalage, au moins, il y a une solution à cela. https://stackoverflow.com/questions/9008150/shifting-a-java-bitset (ils l'appellent décalage gauche, mais un décalage à gauche va dans l'autre sens, pour moi). Pour les décalages à gauche, je ne vois pas immédiatement une solution mais pour étendre '' BitSet'' et ajouter une méthode qui incrémenterait les valeurs stockées d'une quantité donnée. Le faites vous? – User1291

+0

@ User1291 semble être un sous-ensemble du bitset original mais pas réindexé. Une partie du décalage au moins (compensation vers la gauche ou la droite) si vous maintenez un décalage d'index de départ. –