2017-01-25 11 views
-11

Я пытаюсь узнать BitSet коллекция в java. Я прочитал, что он использует биты внутри.Почему Bitset допускает значения, отличные от 1 и 0?

Каждый * компонент набора бит имеет {@code логическое значение}

Я написал небольшое приложение:

BitSet bitSet = new BitSet(); 
bitSet.set(9); 
bitSet.set(5); 
bitSet.set(3); 
System.out.println(bitSet); 
System.out.println(Arrays.toString(bitSet.toByteArray())); 

Я задавался вопросом, что я могу поставить значение, отличное от 1 и 0.

Кроме того, я не понимаю, выход:

{3, 5, 9} 
[40, 2] 

Пожалуйста, объясните мне использование этой коллекции?

+6

https://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html Без обид - но я бы ожидал, что пользователь 6k + будет знать, как искать документы оракула для класса коллекции, читать и понимать это ... – Fildor

+0

@Fildor моя цитата с этой страницы, как вы можете видеть – gstackoverflow

+0

Это не делает ее лучше. Почему вы не поняли документы? Как мы можем дать вам больше или лучше объяснение, чем вы можете там прочитать? Для меня это довольно ясно. Я просто хочу понять, почему это не для вас. – Fildor

ответ

6

BitSet логически представляет собой «вектор бит, который растет по мере необходимости» (javadoc).

Когда вы создаете его через new BitSet(), у вас есть все биты, равные 0 (false).

0 5 10 
| | | 
000000000000... (virtually infinite sequence) 

Используя set(x) вы установили 1 (истина), бит в позиции х (где первая позиция 0); например в вашем коде вы включаете биты 3, 5 и 9.

0 5 10 
| | | 
000101000100... 

toString() сообщает список битов установлен в 1, то есть 3, 5 и 9 в данном примере.

toByteArray() преобразует содержимое BitSet к последовательности byte значений, каждая из которых содержит значение 8 последовательных бит, в мало-Endian порядке (т.е. начиная с наименьших индексов в BitSet). Выход {40, 2} в вашем примере происходит от:

7  0 15  8 <- position in BitSet 
|  | |  | 
{00101000 , 00000010} <- toByteArray(), binary 
    |   | 
{ 40  , 2 } <- toByteArray(), decimal 

Надеется, что это помогает.

+0

Дополнительный вопрос: когда я объявляю «бит бит бит = новый битСеть (8);», то я могу без проблем выполнить 'bits.set (15);' или получить 'bits.get (85);' (преувеличение, я знаю , а просто для того, чтобы показать точку). Когда вы смотрите на реализацию 'public void set (int bitIndex)' в 'BitSet.java', тогда я вижу только исключение, когда индекс отрицательный (достаточно справедливый). Но почему нет, когда вы превышаете максимальную. количество бит, установленных в конструкторе? Я также видел, что конструктор 'public BitSet (int nbits)' не содержит локальную переменную, чтобы отслеживать количество бит, переданных в конструкторе ... – GeertVc

+1

@GeertVc N вы переходите к 'новому BitSet (N) 'подобен размеру заданного значения битового набора и используется для распределения внутреннего битового хранилища. Если вы установите бит над таким размером, «BitSet» должен расширить внутреннее хранилище, чтобы выделить его, но он все же позволяет это сделать. Этот же принцип используется в других классах коллекции 'java.util', например. 'new ArrayList (10)' создает список, первоначально поддерживаемый массивом размера 10, но все же позволяет добавлять более 10 элементов, выделяя при необходимости большой массив. – rrobby86

4

BitSet.set(int bitIndex) устанавливает бит в указанном индексе равным true.

Так bitSet.set(9); переворачивает номер бита 9 к 1

На выходе:

  • System.out.println(bitSet); печатает результат toString который согласно JavaDoc:

для каждого индекса, для которого этот бит-бит содержит бит в заданном состоянии, десятичное представление этого индекса включено в результат. S

Шаг за шагом, он разбивает двоичный набор: 1000101000

в байты: 10 00101000

, которая 2 и 40 в десятичной системе счисления.

7

Вы можете установить биты номер 3, 5 и 9:

byte#  1     0 
index … 9 8 7 6 5 4 3 2 1 0 
value … 1 0 0 0 1 0 1 0 0 0 

Двоичный 10 десятичный 2 (2¹ = 2).

Двоичный 00101000 является десятичным числом 40 (2³ + 2⁵ = 8 + 32 = 40).

+0

как насчет 2^9? – gstackoverflow

+0

@gstackoverflow byte имеет ширину 8 бит. Итак, 2^9 заканчивается вторым байтом, так что это будет 00000010 => 2 в байте с индексом 1. – Fildor

+0

aaaaa, спасибо. Я понял – gstackoverflow

 Смежные вопросы

  • Нет связанных вопросов^_^