java 中的 BitSet 存储的是位还是整数?

Does BitSet in java stores bits or integers?

我发现了很多关于 bitset 的编码网站。但是我不明白它存储的是位还是整数。

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 存储位还是整数?

它如何将其存储在内存中?

进行任何操作后值如何变化?

通常 BitSet 会使用 long[] 来实现。每个 long 存储 64 个连续的可能位位置。该数组需要的大小等于最高设置位索引减一(以允许索引 0)除以 64(向下舍入)。设置位表示为二进制 1,数组中存在但未设置为二进制 0 的位。

因此您的示例的内部表示类似于:

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

(第 8-63 位从常量中删除 - 如果需要,请添加所有零。)

BitSet 使用 longs:

的数组存储位
private long[] bits;

操纵这意味着您使用按位运算来操纵这些 long 的位 和班次

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

这意味着您使用当前位掩码的所有位和所需偏移量的新设置位来计算新的位掩码。

Source Code