2016-03-30 13 views
3

Я использую BitSet в своем приложении и хотел бы проверить с помощью метода, если все используемые биты в BitSet установлены в true. Теперь я знаю способ isEmpty(), который проверяет, установлены ли все биты на false, однако я не могу найти положительный случай. Я знаю, что могу сделать что-то вроде someBitSet.cardinality() == someBitSet.size(), но это кажется неуклюжим. Я что-то упускаю или есть явная причина, почему такой метод не реализован, но в противном случае?Проверьте, установлены ли все биты в BitSet равным true

ответ

6

Нет такой вещи, как «все биты в BitSet», потому что в любое время вы можете установить бит, который больше, чем максимальный бит, установленный до сих пор. Предположим, что вы хотите сохранить в BitSet до 10 значений. Таким образом, вы устанавливаете 10 бит и хотите проверить, все ли они истинны. Однако BitSet не знает, что у вас всего 10 бит. Что, если у вас будет больше? В следующий раз вы можете позвонить bitSet.set(10000), и он будет работать (BitSet будет автоматически изменяться).

Обратите внимание, что bitSet.size() не очень полезно в общем случае: речь идет о потребленной памяти. Текущая реализация всегда кратна 64, поэтому, если у вас есть только 10 разных состояний, someBitSet.cardinality() == someBitSet.size() всегда будет возвращать false. Даже если вы создали BitSet с new BitSet(10). Параметр конструктора - это только желаемая начальная емкость (как в ArrayList). Он используется только как подсказка производительности.

Лучшее решение с точки зрения производительности, чтобы проверить nextClearBit(0) >= myLength где myLength это максимальное число значений, которые необходимо хранить в BitSet (вы должны держать его самостоятельно). Это может работать быстрее, чем cardinality(), если результатом является false.

+0

Да, однако в документации указано, что: бит бит имеет текущий размер, который представляет собой количество бит пространства, которое в настоящее время используется битным набором. Поэтому я решил, что было бы полезно, если бы можно было легко проверить были ли все они установлены на истину. EDIT: Хорошо, теперь увидишь свое редактирование. Благодарю. Тогда я полагаю, что набор бит не может быть моей выборкой данных здесь. – conipo

+0

@Jonathan, он будет работать, если вам действительно нужны 64, 128, 192 и т. Д. Бит. Любой другой начальный размер будет автоматически расширен до следующего кратного 64 (и это детализация реализации, вы не можете полагаться на это!). –

+1

Кажется, вам не хватает ['BitSet.length()'] (https://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html#length--): "* Возвращает «логический размер» этого BitSet: индекс самого старшего бита бит в BitSet плюс один * », который является именно желаемой вещью, в отличие от' size() '. Таким образом, операция, которую вы хотите, это 'bs.length() == bs.nextClearBit (0)', которая работает и потенциально более эффективна, чем решение на основе 'cardinality()', но все еще столь же неуклюжие. – Holger