You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java BitSet的set方法如何通过左移运算设置指定比特位

Java BitSet set方法单比特置1实现原理

Java BitSet的set(int bitIndex)方法用于将指定索引的比特位置为true(即二进制1),方法完整源码如下:

public void set(int bitIndex) {
    if (bitIndex < 0)
        throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);

    int wordIndex = wordIndex(bitIndex);
    expandTo(wordIndex);

    words[wordIndex] |= (1L << bitIndex); // Restores invariants

    checkInvariants();
}

去掉参数校验、数组扩容、一致性检查的辅助逻辑,核心功能完全由words[wordIndex] |= (1L << bitIndex)这行代码实现,原理可以拆成两部分理解:

底层存储基础

BitSet底层用long[]类型的words数组存储比特位,每个long值占64位,因此单个数组元素可以存储64个连续的比特位。wordIndex(bitIndex)的作用就是计算目标比特位落在数组的哪个下标位置,本质是做bitIndex / 64的整除运算,确保我们只会修改存储了目标比特的那个数组元素,不会碰其他位置的存储字。

掩码生成与按位或运算

这行代码的右侧1L << bitIndex是整个逻辑的核心,作用是生成仅目标比特位为1、其余位全为0的位掩码:

  • 首先1L是64位长整型的数值1,二进制表示只有最低位(第0位)为1,剩余63位全为0
  • 左移运算符<< n会把二进制位整体向左移动n位,低位补0,因此1L << bitIndex就会把唯一的1,从第0位移到和目标比特位对应的偏移位置。这里要注意必须用1L而不是int类型的1:int只有32位,左移超过31位就会出现溢出错误,而64位的long可以覆盖单个存储字的全部位位置;同时Java对long左移超过64位的场景会自动对移位数取模64,刚好和wordIndex的整除计算逻辑匹配,不会出现错位。

生成掩码之后,用按位或运算符|=把掩码和原有存储字的值做合并:
按位或的运算规则是,两个操作数对应比特位只要有一个为1,结果位就为1,否则为0。这就带来两个效果:

  • 掩码上为0的所有位:和原有值做或运算时,结果完全等于原有值,不会产生任何修改
  • 掩码上为1的目标位:不管原有值在这个位置是0还是1,运算后结果一定为1,正好实现置1的需求

举个简单的示例:假设当前存储字的值是二进制1010(即十进制10,第1、3位为1),现在要把第2位置为1:

  1. 生成掩码:1L << 2 对应二进制0100
  2. 做或运算:1010 | 0100 = 1110
    运算结果里只有第2位从0变成了1,其余位和原值完全一致,没有多余修改。

内容的提问来源于stack exchange,提问作者yoni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:27:24