8
votes

java.util.bitset - Set () ne fonctionne pas comme prévu

Est-ce que je manque quelque chose de douloureusement évident? Ou est-ce que personne dans le monde n'utilise réellement java.util.bitset?

Le test suivant échoue: p> xxx pré>

Il n'est vraiment pas clair pour moi pourquoi je ne finis pas avec un bitset de longueur 2 et la valeur 10. J'ai jeté un coup d'œil à la source de Java.Util.Bitset, et sur l'inspection occasionnelle, il semble ne pas manquer de distinction suffisante entre un morceau qui a été défini de faux et un peu qui n'a jamais été fixé à n'importe quelle valeur ... p>

(Notez que définir explicitement la taille du bitset dans le constructeur n'a aucun effet, par exemple: P>

BitSet b = new BitSet(2);


2 commentaires

"Ou fait exactement personne dans le monde n'utilise réellement java.util.bitset?" ... Oui, à droite, tirez l'autre - il a obtenu des cloches dessus!


@Stephen quel autre? ;-)


6 Réponses :


9
votes

Vous avez un bit le plus élevé (comme dans "réglé sur 1") est bit 0. La longueur doit donc être de 1.

Voir le Javadoc pour Longueur :

longueur int tout ()

retourne la "taille logique" de ce bitset: l'index du bit de jeu le plus élevé dans le bitset plus un. Retourne zéro si le bitset ne contient pas de bits de jeu.

Peut-être que vous recherchez Taille Bien qu'il soit possible que ce soit plus élevé que deux si les bits sont alloués à une certaine résolution (disons 16 limites de bits)?


1 commentaires

Zz, je l'ai nettoyé pour m'assurer qu'il était clair (et + 1'ed It), j'espère que ça ne vous dérange pas. Étant donné que j'ai initialement mal compris "Set" comme "a été réglé sur quoi que ce soit", des mortels moindres peuvent également avoir ce problème :-)



6
votes

Les gens utilisent bitset ; Cependant, ils l'utilisent pour autre chose que ce que vous avez l'intention. Il est probablement préférable de penser à bitset comme une forme très compacte et efficace de la mémoire de définir qui a la propriété particulière que vous ne pouvez pas mettre des nombres négatifs .

Il est très courant avec bitset s pour les utiliser dans le motif de xxx

après avoir fait quelque chose pour les remplir. Cela équivaut à itération des éléments de l'ensemble .


2 commentaires

Bonne explication. Fondamentalement, il semble que Bitset ne soit pas très bien adapté à la représentation d'un bitfield (ou d'une matrice de bit) de longueur fixe.


Eh bien, pour une longueur fixe , si vous ne comptez pas sur le bitset pour maintenir la longueur pour vous, tout va bien. Si vous voulez que le bitset traite la longueur pour vous, vous serez déçu.



2
votes

Étant donné que le bitset est soutenu par un [] long [], la taille minimale est de 64 (car 1 long est de 64 bits). La taille est incrémentée par un multiple de 64 et pour une raison quelconque, elles n'ont pas maintenu le nombre de bits que vous aviez destiné à représenter lorsque vous utilisez le constructeur qui prend un int.


0 commentaires

4
votes

Cela me perplexe aussi, pas sûr de la justification de la fonctionnalité actuelle de Bitset plutôt inattendue. Cependant, étant donné que ce n'est pas final, nous pouvons utiliser certaines tactiques et prolonger la tactique et procéder à ce qui suit pour obtenir un bitset fixe avec une sémantique de longueur comme prévu: xxx


0 commentaires

0
votes

Bon Casper! Votre petite amélioration devrait en effet avoir été présente dans l'original Bitset Java def! Je suggère également que cela (append () et concat () sont utiles pour divers usages)

import java.util.BitSet;

public class fixBitSet extends BitSet {

  public int fsize = 0;

  public void set(int k, boolean value) {
    if (k >= fsize)
      fsize = k + 1;
    super.set(k, value);
  }

  public void append(fixBitSet bs) {
    for (int k = 0; k < bs.fsize; k++)
      super.set(fsize + k, bs.get(k));
    fsize += bs.fsize;
  }

  public static fixBitSet concat(fixBitSet[] vbs) {
    final fixBitSet bs = new fixBitSet();
    for (fixBitSet xbs : vbs)
      bs.append(xbs);
    return (bs);
  }

}


0 commentaires

1
votes

// Abhay DANDEKAR

State 0 : 64 : 0

State 1 : 64 : 2

State 2 : 64 : 2

State 3 : 64 : 5


0 commentaires