Главная » Java » BitSet

0

 

   Класс поддерживает средства создания битовых векторов (bit vector), допускающих динамический рост. Структура данных объекта — это множество (set) из 2^31 битов, способных содержать значение true или false и изначально инициализируемых значением false. Биты индексируются от 0 до Integer .MAX_VALUE, и их значения могут быть заданы, считаны или сброшены по отдельности. Объект для хранения данных использует последовательность битов необходимого и достаточного объема — ее длина определяется наибольшим значением индекса установленного бита, а все биты с большими индексами считаются равными false.

        Класс содержит два конструктора, описанных ниже.

 

public (int size)

Создает новый объект битового вектора с объемом, который достаточен для представления последовательности битов, индексированных от 0 до size-1. Значения всех битов изначально устанавливаются равными false.

 

public  ()

Создает новый объект битового вектора с объемом, предлагаемым по умолчанию. Значения всех битов изначально устанавливаются равными false. В составе класса предусмотрены три метода, позволяющих манипулировать отдельными битами. Каждый из методов выбрасывает исключение типа indexOutOf Bounds Exception, если заданное значение индекса отрицательно.

 public void set(int index)

Присваивает биту с индексом index значение true.

public void clear(int index)

Присваивает биту с индексом i ndex значение false.

public boolean get(int index)

Возвращает значение бита с индексом index.

   Существуют  методы,   предназначенные  для  выполнения  побитовых  логических операций над содержимым текущего и заданного векторов.

 

 public void and( other)

Осуществляет операцию логического И (AND) над содержимым текущего битового вектора и вектора Other и сохраняет результат в текущем объекте . Каждый бит результата принимает значение true только в том случае, когда соответствующие биты обоих векторов содержат true.

public void andNot( other)

Сбрасывает в false значения тех битов текущего вектора, для которых соответствующие биты вектора other содержат true, и сохраняет результат в текущем объекте . Каждый бит результата сберегает значение true только в том случае, когда соответствующий бит вектора other содержит false.

public void or( other)

Осуществляет операцию логического ИЛИ (OR) над содержимым текущего битового вектора и вектора other и сохраняет результат в текущем объе те . Каждый бит результата принимает значение true только в то случае, когда по меньшей мере один из соответствующих битов обоих векторов содержит true.

 

public void xor( other)

Осуществляет операцию логического исключающего ИЛИ (XOR) над содержимым текущего битового вектора и вектора other и сохраняет результат в текущем объекте . Каждый бит результата принимает значение true только в том случае, когда соответствующие биты обоих векторов содержат различные значения.

   Вкратце перечислим и иные методы, имеющиеся в составе класса .

public int size()

Возвращает количество битов, хранимых в текущем объекте в данный момент. Присваивание значения true биту с индексом, равным или превышающим size О, может привести к увеличению объема памяти, отведенного под текущий вектор.

public int length()

Возвращает увеличенное на единицу значение индекса последнего из битов вектора, содержащих true.

public int hashCode()

Возвращает значимый хеш-код для текущего битового вектора, основанный на содержимом последнего. Если объект используется в контексте хеш-таблицы, изменять значения его битов не рекомендуется, поскольку иначе хеш-код не будет соответствовать содержимому объекта.

 

public boolean equals(Object other)

Возвращает true, если соответствующие биты текущего вектора и вектора other содержат одинаковые значения.

 

  Обратите внимание, что из-за особенностей способа хранения данных в объекте методов, которые позволили бы получить побитовое дополнение, не существует. Впрочем, подобного результата нетрудно добиться "обходными" путями — скажем, с помощью метода хог, аргументом которого служит множество битов, равных true.

  Рассмотрим пример класса, в котором объект используется в качестве хранилища бинарных признаков, отмечающих присутствие в строке тех или иных символов. Каждому биту вектора отвечает определенный символ: так, например, биту, расположенному на нулевой позиции, соответствует символ \u0000, бит с индексом 97 представляет символ ‘а’ и т.д. После выполнения вычислений на основании содержимого битового вектора легко получить список имеющихся в строке символов и вывести его на экран.

 

public class whichchars  {

     private used = new ();

 

public whichchars(string str)   {

       for (int i = 0; i < str.length(); i++)

            used.set(str.charAt(i));

}

public string toString() {

    String desc = "[";

     int length = used. length() ;

      for (int i = 0; i < length; i++) {

          if (used.get(i))

          desc +=  (char)  i;

    }

return desc + "]";

  }

//………

}

Если передать конструктору Whichchars такую строку, как, например, "Testing  1 2 3", метод toString вернет следующий результат:

[ 123Teginst]

который отображает последовательность символов (включая пробелы), присутствовавшие в исходной строке; символы отсортированы в порядке возрастания их числовых кодов.

  

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии