Хранит ли BitSet в Java биты или целые числа? - PullRequest
0 голосов
/ 08 декабря 2018

Я сталкивался со многими сайтами по кодированию о битсете.Но я не могу понять, хранит ли он биты или целые числа.

BitSet создает массив битов, представленных логическими значениями.

import java.util.*; 
public class GFG 
{ 
    public static void main(String[] args) 
    { 
       BitSet bs1 = new BitSet(); 
       BitSet bs2 = new BitSet(6); 

       bs1.set(0); 
       bs1.set(1); 
       bs1.set(2); 
       bs1.set(4); 

       bs2.set(4); 
       bs2.set(6); 
       bs2.set(5); 
       bs2.set(1); 
       bs2.set(2); 
       bs2.set(3); 

       System.out.println("bs1  : " + bs1); 
       System.out.println("bs2  : " + bs2); 
    } 
} 
Output:

bs1 : {0, 1, 2, 4}
bs2 : {1, 2, 3, 4, 5, 6}

BitSet хранит биты или целые числа?

Какхранит ли он это в памяти?

Как меняются значения при выполнении каких-либо манипуляций?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

BitSet хранит биты, используя массив long s:

private long[] bits;

Управление этим означает, что вы манипулируете битами этих длин, используя битовые операции и сдвиги

public void set(int pos)
{
  int offset = pos >> 6; // divide by 2^6 = 64
  ensure(offset);        // if needed extend array
  // ArrayIndexOutOfBoundsException subclasses IndexOutOfBoundsException,
  // so we'll just let that be our exception.
  bits[offset] |= 1L << pos; // set bit using OR and a shift
}

Некоторые иллюстрациииз того, что происходит для 6 битов (индекс 0-5):

init  000000

set 3:
      000000
   OR 001000 = 1 << 3
   =  001000

set 5:
      001000
   OR 100000 = 1 << 5
   =  101000

Это означает, что вы берете все биты текущей битовой маски и новый бит требуемого смещения для вычисления новой битовой маски.

Исходный код

0 голосов
/ 08 декабря 2018

Обычно BitSet будет реализовано с использованием long[].Каждый long хранит 64 последовательных возможных положения битов.Массив должен иметь размер, равный максимальному установленному индексу бита минус один (чтобы учесть индекс 0), деленному на 64 (округляется в меньшую сторону).Установленные биты представляются в виде двоичного числа 1, а биты присутствуют в массиве, но не устанавливаются в виде двоичного числа 0.

Таким образом, внутреннее представление ваших примеров будет выглядеть примерно так:

bs1 = new long[] { 0b00010111L }; // 23
bs2 = new long[] { 0b01111110L }; // 126
     // bit indexes: 76543210

(Биты 8-63 исключены из констант - добавьте все нули, если хотите.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...