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/