java - BitSet 的 set 方法如何处理向左移动的位?

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) .我可以在作业中清楚地看到,左侧部分是包含相关位的特定单词。但是,我不明白右边的部分(位索引的左移)如何导致请求的(并且只有它)位设置为 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”位。

这mask然后与 words[wordIndex] 中的内容按位或运算. words[wordIndex]中的每一位保持不变,因为它们与 0 进行了“或”运算,除了掩码中为“1”的一个地方。 words[wordIndex] 中的那个位由于 OR 的工作原理,无论它最初是什么,都会变成“1”。

https://stackoverflow.com/questions/72924423/

相关文章:

r - 为什么带有 %in% 的条件会忽略缺失值?

excel - 按分隔符幂查询的 X 实例拆分行

java - 使用流 groupingBy 时将字符串分组为多个组

sql - SQL Server 中 OVER 和 PARTITION BY 生成的值的状态

sql - 如何在 Snowflake 的枢轴中使用 LISTAGG?

bash - awk 或条件

python - FastAPI 多个路由绑定(bind)到同一个函数。如何知道请求了哪一个

c# - 返回匿名类型的 IEnumerable

string - 如何将字符串中的 "Umlaute"(ü)转为 "ue"?

c - scanf() 不写入二维字符数组