我遇到了许多关于位集的编码站点。但是我不明白它是存储位还是整数。
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是存储位还是整数?
它如何将其存储在内存中?
完成任何操作后,值如何变化?
答案 0 :(得分:2)
通常,BitSet
将使用long[]
来实现。每个long
存储64个连续的可能位位置。该数组的大小等于最高设置位索引减去1(以允许索引0)除以64(四舍五入)。设置位用二进制1表示,数组中存在位,但未设置为二进制0。
因此,示例的内部表示将类似于:
bs1 = new long[] { 0b00010111L }; // 23
bs2 = new long[] { 0b01111110L }; // 126
// bit indexes: 76543210
(第8-63位从常量中删除-如果需要,可将所有零添加。)
答案 1 :(得分:0)
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
这意味着您需要使用当前位掩码的所有位以及所需偏移量的新设置位来计算新的位掩码。