setBit 和 clearBit 是 BigInteger 中返回新对象的不可变位操作方法:setBit(n) 将第 n 位设为 1,clearBit(n) 将第 n 位设为 0,均要求 n ≥ 0,需接收返回值,支持高位自动扩展。

setBit 和 clearBit 是 BigInteger 中用于修改指定位(bit)的两个关键方法,它们**返回新对象**(因为 BigInteger 不可变),不修改原值。
setBit(int n):将第 n 位设为 1
把从右往左、从 0 开始编号的第 n 位(即 2ⁿ 对应的位)置为 1。若该位原本就是 1,结果不变;若为 0,则翻转为 1。
例如:BigInteger.ONE.setBit(2) → 原值是 1(二进制 0b1),将第 2 位(即 4 的位置)设为 1,得到 0b101 = 5。
常用写法:
- 要确保某标志位开启(如权限位、状态位),用
big.setBit(index) - 索引 n 必须 ≥ 0,否则抛
ArithmeticException
clearBit(int n):将第 n 位设为 0
把第 n 位强制清零。若该位原本就是 0,结果不变;若为 1,则翻转为 0。
立即学习“Java免费学习笔记(深入)”;
例如:BigInteger.valueOf(7).clearBit(1) → 7 是 0b111,清除第 1 位(即 2 的位置),得到 0b101 = 5。
注意点:
- 对负数也有效(
BigInteger使用二进制补码逻辑,但clearBit按无符号位操作语义处理) - 同样要求 n ≥ 0,否则异常
常见误区和注意事项
这些方法不会改变原对象,必须接收返回值:
- ❌ 错误:
val.setBit(3);—— 返回值被丢弃,val仍不变 - ✅ 正确:
val = val.setBit(3);或newVal = val.setBit(3); - 高位自动扩展:即使原数只有 4 位,
setBit(10)会生成一个至少 11 位的数,高位补 0
替代方案:flipBit 和 testBit
如果需要翻转(0↔1)用 flipBit(n);检查某位是否为 1 用 testBit(n)(返回 boolean)。
组合使用示例:if (flags.testBit(5)) { flags = flags.clearBit(5); } —— 先判断再清除


















