Java的BitSet类有一个方法Set,该方法将单个位设置为1(=true).方法源代码如下:

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).我可以在作业(job)中清楚地看到,左边的部分是包含相关位的特定单词.然而,我不理解右侧部分(位索引的左移)是如何将请求的位(并且只有它)设置为1的.你能解释一下吗?

推荐答案

1L << bitIndex生成一个long,其位除其中一位外均为0."1"位的位置由bitIndex确定.例如,如果bitIndex为10,则第11个最低有效位为1.

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100 0000 0000

因为1向左移动了10次.通常,第(bitIndex mod 64+1)个最低有效位是"1"位.

然后,这maskwords[wordIndex]中的任何内容按位或运算.words[wordIndex]中的每一位都保持不变,因为它们用0进行OR'ed,除了掩码中的一个位置是"1".words[wordIndex]中的那个位将变为"1",无论它最初是什么,由于如何或如何工作.

Java相关问答推荐

Collections.binarySearch()使用Collections.reverseOrder()作为比较器返回-1

如何让HikariCP指标在NewRelic中正确显示?

我应该避免在Android中创建类并在运行时编译它们吗?

Java在模块化jar文件中找不到类,但是javap可以

使用动态ID从json获取详细信息的Jolt规范

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

对某一Hyroby控制器禁用@cacheable

如何修复IndexOutOfBoundsException在ClerView适配器的onRowMoved函数?

通过Spring Security公开Spring Boot执行器端点

Jolt变换JSON数组问题

buildDir:File!&#的getter解决方案是什么?39.被抛弃

是否在settings.xml中使用条件Maven镜像?

从Spring6中的JPMS模块读取类时出现问题

为什么这种递归会有这样的行为?

嘲笑黄瓜中的对象

Maven-Dependency-Plugin 3.6.+开始查找在依赖关系:分析目标期间找到的新的使用的未声明依赖关系

在Java中比较同一多维数组的两个不同的字符串元素

HBox内部的左对齐按钮(如果重要的话,在页码内)

如何在Selenium上继续使用最新的WebDriver版本

ANTLR 接受特殊字符,例如 .标识符或表达式中的(点)和 ,(逗号)