首页 文章

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

提问于
浏览
1

我遇到了很多关于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存储位或整数?

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

任何操作完成后值如何变化?

2 回答

  • 0

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

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

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

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

  • 2

    BitSet使用 long 的数组存储位:

    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

相关问题