[英]How does BitSet's set method work with bits shifting to the left?
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”位。
然后将此掩码与words[wordIndex]
中的任何内容进行按位或运算。 words[wordIndex]
中的每一位都保持不变,因为它们与 0 进行或运算,除了掩码中它是“1”的地方。 由于 OR 的工作方式, words[wordIndex]
中的那个位无论最初是什么都将变为“1”。
有两个感兴趣的部分: 1L << bitIndex
和words[wordIndex] |=
。
第一部分1L << bitIndex
移动了一些点。 这是一张表格,显示了在几个不同的换档次数下它是如何发挥作用的。
陈述 | 十进制 | 二进制 |
---|---|---|
1升 << 0 | 1 | 1 |
1L << 1 | 2 | 10 |
1L << 2 | 4 | 100 |
1L << 3 | 8 | 1000 |
1L << 4 | 16 | 10000 |
第二部分 – words[wordIndex] |=
– 获取words[wordIndex]
中已有的任何值,并使用按位“或”来包含从上面隔离的任何位。 如果该位已设置(对于该字),则此操作不会更改任何内容。 如果该位为 0,则“或”操作 ( |=
) 会将该位设置为 1。
请记住,左侧正在与该位进行 ORed ( |
),而最右边的位(或最低有效位 - LSB)是位0
。 OR
运算符会将源中指定的一位设置为目标中的相同位,而其他位保持不变。 这里有些例子。
int bits = 1;
System.out.println(Integer.toBinaryString(bits));
bits |= 0b100_0000_0000; // set bit 10 to 1.
System.out.println(Integer.toBinaryString(bits));
印刷
1
10000000001
^
bit 10
或者这样做
System.out.println(Integer.toBinaryString(bits));
bits = 1;
// or it can be done this way.
bits |= 1<<10; // 10 is the bitIndex in bits to set so it is shifted
// left to that position and the result is as before
System.out.println(Integer.toBinaryString(bits));
印刷
10000000001
^
bit 10
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.