java.util. BitSet — набор () не работает как ожидалось

Я пропускаю что-то крайне очевидное? Или делает просто, никто в мире на самом деле не использует java.util. BitSet?

Следующие тестовые сбои:

@Test
public void testBitSet() throws Exception {
    BitSet b = new BitSet();
    b.set(0, true);
    b.set(1, false);
    assertEquals(2, b.length());
}

Действительно неясно мне, почему я не заканчиваю с BitSet длины 2 и значение 10. Я посмотрел на источник для java.util. BitSet, и на эпизодическом контроле, между которым этому, кажется, не удается сделать достаточное различие немного, это было установлено ложь и немного который никогда не устанавливался ни на какое значение...

(Обратите внимание, что явно установка размера BitSet в конструкторе не имеет никакого эффекта, например:

BitSet b = new BitSet(2);
7
задан denishaskin 18 May 2010 в 01:40
поделиться

3 ответа

Люди действительно используют BitSet ; однако они используют его не для того, что вы намереваетесь. Вероятно, лучше всего рассматривать BitSet как очень компактную, эффективную с точки зрения памяти форму Set , обладающую тем особенным свойством, что вы не можете помещать в него отрицательные числа.

Очень часто с BitSet s использовать их в шаблоне

for (int id = set.nextSetBit(0); id >= 0; id = set.nextSetBit(id + 1)) {
  // do stuff to a set index
}

после того, как вы что-то сделаете, чтобы их заполнить. Это эквивалентно итерации по элементам набора Set .

6
ответ дан 6 December 2019 в 08:42
поделиться

Ваш старший установленный бит (в смысле "установленный в 1") - это бит 0. Поэтому длина должна быть равна 1.

См. JavaDoc для длины:

public int length()

Возвращает "логический размер" этого BitSet: индекс старшего установленного бита в BitSet плюс один. Возвращает ноль, если набор битов не содержит установленных битов.

Возможно, вы ищете размер, хотя возможно, что он может быть больше, чем два, если биты распределяются с определенным разрешением (скажем, на границах 16 бит)?

9
ответ дан 6 December 2019 в 08:42
поделиться

Учитывая, что набор битов поддерживается long[], минимальный размер равен 64 (поскольку 1 long равен 64 битам). Размер увеличивается на кратное 64, и по какой-то причине они не сохранили количество битов, которое вы намеревались представить, когда используете конструктор, который принимает int.

2
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: