Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的BitSet存储位还是整数?_Java_Bitset - Fatal编程技术网

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

java中的BitSet存储位还是整数?,java,bitset,Java,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);

我遇到了许多关于比特集的编码站点。但我不知道它是存储位还是整数

位集创建由布尔值表示的位数组

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

它如何将其存储在内存中


执行任何操作时,值如何变化?

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

因此,示例的内部表示形式如下:

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

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

位集使用
的数组存储位:

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
}
公共作废集(int pos)
{
int offset=pos>>6;//除以2^6=64
确保(偏移);//如果需要,扩展数组
//ArrayIndexOutOfBoundsException子类IndexOutOfBoundsException,
//所以我们就让这成为我们的例外。

位[offset]|=1L,因此,它不会根据给定的值类型进行存储。如果我给出整数值b.set(5),它只会将其视为真(1)。对吗?
b.set(5)
将索引为5的位设置为1;
b.clear(5)
将索引为5的位设置为0。具有
集(5)的空
位集
调用它将包含一个值为
{32L}
(32是2^5)的数组。哪里可以优先使用位集?@vicky如果你有一个小的非负
int
的密集集,它比,比如说,
哈希集
更有效。太好了!!有任何例子或比较研究表明它的效率吗?
init  000000

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

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