如何将长度为32的BitSet的所有位填充为0?
问题原因
你遇到的set(i, false)没生效的问题,是BitSet的底层实现逻辑导致的:
- BitSet构造方法传入的32是初始容量,不是固定的位长度,它本身是动态扩容的结构
- 未被设置为true过的位,默认就是false状态,也不会在底层数组中实际分配空间。你直接对未初始化的位调用
set(i, false),BitSet会判定不需要做任何修改,所以看起来没有填充效果。
实现32位全0的几种方案
- 方案1:利用你现有已经把0~31位全部设为1的逻辑,直接调用
clear()方法统一清空longWord = new BitSet(32); // 先把0~31位全部设为1,完成位初始化 for(int i = 0; i < 32; i++) { longWord.set(i); } // 直接清空所有位为false longWord.clear(); System.out.println(longWord); - 方案2:用范围设置方法直接批量赋值,不需要提前初始化
直接调用set(int fromIndex, int toIndex, boolean value)方法,它会自动完成范围内位的初始化再赋值:longWord = new BitSet(32); // 直接把0~32位(左闭右开)全部设为false longWord.set(0, 32, false); - 方案3:直接从全0的long数组生成BitSet(Java 1.7+支持)
// 一个long元素对应64位,全部初始为0,生成的BitSet对应前64位全为0,32位场景完全够用 longWord = BitSet.valueOf(new long[1]);
内容的提问来源于stack exchange,提问作者Frank Fiumara
相关产品推荐
相关产品推荐

