繁体   English   中英

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

[英]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 << bitIndexwords[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM