BitSet.xor()执行逻辑异或运算,结果存于调用方BitSet中;某位为true当且仅当两BitSet在该位取值不同,直接修改原对象,短者高位补false,负索引抛异常。

BitSet.xor() 方法执行的是两个位集之间的逻辑异或(XOR)运算,结果保留在调用方 BitSet 中,不返回新对象。它的行为等价于集合意义上的“对称差”:某一位为 true 当且仅当它在两个 BitSet 中的取值**不同**(一个为 true,另一个为 false)。
异或结果的判定规则
对任意索引 i,设 bs1.get(i) 为 a,bs2.get(i) 为 b,则执行 bs1.xor(bs2) 后,bs1.get(i) 变为 a ^ b(即布尔异或):
true ^ true → falsefalse ^ false → falsetrue ^ false → truefalse ^ true → true
实际操作中的关键细节
该方法会直接修改原 BitSet,不是创建副本:
- 如果需要保留原始数据,调用前应使用
clone()复制一份 - 两个 BitSet 长度不同时,较短者在高位默认补
false,不会越界或抛异常 - 索引为负数会立即抛出
IndexOutOfBoundsException,注意校验输入 - 内部以 long 数组分块处理,但语义上仍是逐位运算,与 CPU 指令无关
常见用途示例
适合用于需要高效计算差异或特征对比的场景:
- 权限比对:用户权限 BitSet 与角色权限 BitSet 异或,得到差异权限位
- 状态同步:两台设备各自维护的状态位集,异或后可快速定位需更新的位
- 字节数组级异或:用
BitSet.valueOf(byte[])转换后异或,再用toByteArray()还原,可用于简单加密或校验
和普通整数异或的区别
BitSet.xor() 不是把整个 BitSet 当作一个大整数去算按位异或,而是按位索引一一对应操作。例如:
-
bitset1 = {0, 2}(即二进制 ...000101) -
bitset2 = {1, 2}(即二进制 ...000110) - 异或后结果为
{0, 1}(即 ...000011),因为只有第 2 位相同(都为 true),被消去

















