BitSet.flip()在Java中有两种重载:1. flip(int bitIndex)翻转指定索引位;2. flip(int fromIndex, int toIndex)翻转左闭右开区间内所有位;无全量取反方法,需用flip(0, bs.length())模拟。

BitSet.flip() 是 Java 中对位集(BitSet)执行按位取反操作的核心方法,但它并不直接翻转整个 BitSet 的所有位,而是根据调用方式决定作用范围:可以翻转指定位置的单个位,也可以翻转指定区间内的所有位。
flip(int bitIndex):翻转单个位
该重载方法接收一个整数索引,将 BitSet 中对应位置的位由 true 变为 false,或由 false 变为 true。
- 索引从 0 开始,超出当前 BitSet 容量时会自动扩展(即高位补 false)
- 例如:
bs.flip(3)表示把第 4 位(下标为 3)的值取反
flip(int fromIndex, int toIndex):翻转连续区间(左闭右开)
这是实现“变量位集局部取反”的常用方式。它将 [fromIndex, toIndex) 范围内的每一位都执行一次 flip 操作。
- 注意是右开区间:toIndex 本身不参与翻转
- 如果 toIndex 大于当前 BitSet 长度,自动扩展并默认填充 false,再翻转新增部分中落在区间内的位
- 例如:
bs.flip(0, 8)相当于对低 8 位做按位取反(类似字节级 ~ 操作)
想对整个 BitSet 取反?需要先确定有效长度
BitSet 没有内置的 “flipAll()” 方法。若要模拟全量取反,需明确“全部”指什么:
- 若按逻辑长度(
bs.length()):可调用bs.flip(0, bs.length()) - 若按实际分配容量(可能更大):需用
bs.flip(0, bs.size()),但 size() 返回的是内部数组容量,通常不推荐 - 更安全的做法是先设定期望范围,再 flip,避免误翻未使用的高位
和布尔数组取反的区别
BitSet 的 flip 不是“一次性计算所有位再赋值”,而是就地修改,时间复杂度接近 O(n),其中 n 是区间内位的数量。它不生成新对象,也不影响其他位——这使得它适合高效、增量式地管理标志位集合。

















