Я использую BitSet
в своем приложении и хотел бы проверить с помощью метода, если все используемые биты в BitSet
установлены в true
. Теперь я знаю способ isEmpty()
, который проверяет, установлены ли все биты на false
, однако я не могу найти положительный случай. Я знаю, что могу сделать что-то вроде someBitSet.cardinality() == someBitSet.size()
, но это кажется неуклюжим. Я что-то упускаю или есть явная причина, почему такой метод не реализован, но в противном случае?Проверьте, установлены ли все биты в BitSet равным true
ответ
Нет такой вещи, как «все биты в 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
.
Да, однако в документации указано, что: бит бит имеет текущий размер, который представляет собой количество бит пространства, которое в настоящее время используется битным набором. Поэтому я решил, что было бы полезно, если бы можно было легко проверить были ли все они установлены на истину. EDIT: Хорошо, теперь увидишь свое редактирование. Благодарю. Тогда я полагаю, что набор бит не может быть моей выборкой данных здесь. – conipo
@Jonathan, он будет работать, если вам действительно нужны 64, 128, 192 и т. Д. Бит. Любой другой начальный размер будет автоматически расширен до следующего кратного 64 (и это детализация реализации, вы не можете полагаться на это!). –
Кажется, вам не хватает ['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