Настройка JAVA BitSet

Я разрабатываю Java (JDK 1.8) и манипулирую BitSets. Я столкнулся со странной проблемой.

Я создаю экземпляр BitSet размером 160, например:

BitSet example = new BitSet(160);

Я хочу проверить размер, используя метод size(), который дает количество битов в наборе битов. В документации сказано, что конструктор с параметром int N в качестве параметра создает набор битов из N бит.

Но когда я проверяю размер сразу после с помощью

example.size()

Я получаю значение

192

Я не понимаю, почему, кто-нибудь сталкивался с такой проблемой? ссылка на документацию: http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html


person thiout_p    schedule 04.07.2015    source источник
comment
Из документа: Создает набор битов, начальный размер которого достаточно велик для явного представления битов с индексами в диапазоне от 0 до nbits-1.   -  person Sotirios Delimanolis    schedule 04.07.2015


Ответы (2)


Это связано с тем, что конструктор BitSet создает BitSet, «начальный размер которого достаточно велик для явного представления» битов в диапазоне, заданном параметром. Таким образом, фактическое size будет по меньшей мере числом, указанным в параметре, но не обязательно равно этому числу.

Причина, по которой он использует именно 192, заключается в том, что 192 — довольно хорошее двоичное число: 64 * 3.

person Sam Estep    schedule 04.07.2015
comment
Хорошо, теперь я вижу это, большое спасибо! Поэтому я предполагаю, что нет способа создать набор битов, который содержит точное количество битов, заданное в конструкторе. Я буду использовать простой массив. - person thiout_p; 04.07.2015
comment
@thiout_p Зачем вам набор битов точно определенного размера? Вы определили, что ограничения памяти для программы, которую вы создаете, действительно настолько строги? - person Sam Estep; 04.07.2015
comment
@RedRobotHood Просто мне нужно реализовать модель, представляющую собой кусок битов, и я хотел максимально придерживаться ее, но я поступлю иначе. Спасибо за указание на важное слово в документе! - person thiout_p; 04.07.2015
comment
@thiout_p Дело в том, что если вы действительно имеете дело с длинной строкой битов as, использование BitSet было бы и быстрым, и удобным. Единственная причина не использовать его — если дополнительные биты заполнения действительно занимают слишком много оперативной памяти для ваших целей, что я считаю маловероятным. - person Sam Estep; 04.07.2015

Поскольку BitSet фактически используется long[] для хранения 0/1 .

private void initWords(int nbits) {
    words = new long[wordIndex(nbits-1) + 1];
}
person Lance    schedule 18.01.2016