Java 的类有一个将单个位设置为 1 (=true) 的BitSet方法。Set该方法源码如下:
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();
}
Run Code Online (Sandbox Code Playgroud)
除了检查之外,该方法的核心代码是:words[wordIndex] |= (1L << bitIndex)。我可以在作业中清楚地看到,左侧部分是保存相关位的特定单词。但是,我不明白右侧部分(位索引的左移)如何导致请求的(并且只有它)位设置为 1。您能解释一下吗?
1L << bitIndex生成 a long,其位除其中一位外均为 0。“1”位的位置由 确定bitIndex。例如,如果bitIndex为 10,则第 11 个最低有效位为 1。
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100 0000 0000
Run Code Online (Sandbox Code Playgroud)
因为1左移了10次。一般来说,( bitIndexmod 64 + 1)第最低有效位是“1”位。
然后将该掩码与 中的内容进行按位或运算words[wordIndex]。中的每一位都words[wordIndex]保持不变,因为它们与 0 进行“或”运算,除了掩码中的“1”位置除外。words[wordIndex]由于 OR 的工作原理,无论原来是什么,该位都会变成“1”。