什么意味着使用按位运算符时的真实条件

时间:2017-07-11 12:08:43

标签: node.js

在使用js代码的端口时,我在使用按位操作时遇到了困难。

有一个if条件,我不确定我完全理解。

我无法理解的条件是

func (K *KBucket) determineNode(node *KBucketNode, id []byte, bitIndex int) *KBucketNode {
    if len(id) < 20 {
        panic(fmt.Errorf("id length must be 20, got %v", id))
    }
    // **NOTE** remember that id is a Buffer and has granularity of
    // bytes (8 bits), whereas the bitIndex is the _bit_ index (not byte)

    // id's that are too short are put in low bucket (1 byte = 8 bits)
    // parseInt(bitIndex / 8) finds how many bytes the bitIndex describes
    // bitIndex % 8 checks if we have extra bits beyond byte multiples
    // if number of bytes is <= no. of bytes described by bitIndex and there
    // are extra bits to consider, this means id has less bits than what
    // bitIndex describes, id therefore is too short, and will be put in low
    // bucket
    bytesDescribedByBitIndex := int(math.Floor(float64(bitIndex) / 8))
    bitIndexWithinByte := float64(bitIndex % 8)
    if len(id) <= bytesDescribedByBitIndex && bitIndexWithinByte != 0 {
        return node.left
    }

    byteUnderConsideration := id[bytesDescribedByBitIndex]

    // byteUnderConsideration is an integer from 0 to 255 represented by 8 bits
    // where 255 is 11111111 and 0 is 00000000
    // in order to find out whether the bit at bitIndexWithinByte is set
    // we construct Math.pow(2, (7 - bitIndexWithinByte)) which will consist
    // of all bits being 0, with only one bit set to 1
    // for example, if bitIndexWithinByte is 3, we will construct 00010000 by
    // Math.pow(2, (7 - 3)) -> Math.pow(2, 4) -> 16
    y := int(byteUnderConsideration) & int(math.Pow(2, (7-bitIndexWithinByte)))
    if y > 0 {
        return node.right
    }

    return node.left
}

我无法弄清楚在这种情况下什么时候会成真。

完整的原始代码是,

String languageToLoad  = "en"; // your language
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());

移植的代码是,

{{1}}

我通常不会执行这种计算,这一点都不清楚,我无法正确确定打印它们的正确方法,以便开始理解逻辑。

谢谢!

1 个答案:

答案 0 :(得分:2)

首先,如果你正在处理比特而不是:

x * 8
x / 8

也许可以:

x << 3
x >> 3

这将使意图更加明确。

此外,使用它没有多大意义:

byteUnderConsideration & Math.pow(2, (7 - bitIndexWithinByte))

当你能做到:

byteUnderConsideration & (1 << (7 - bitIndexWithinByte))

哪个更清楚(甚至不提及它会更有效率)。

<<运算符向左移位,>>向右移位。

&运算符对同一位置上的位进行AND运算,|运算符对这些位进行OR运算。

你应该花些时间阅读一下JavaScript中的按位运算符(它与C中的运算方式几乎相同)因为你制作了许多奇怪的结构,如:

~~(x / 8)

可以只是:

x >> 3

并且不需要~~(否定完成两次)因为你已经有了一个整数。此外,即使您需要强制转换为整数,也不要执行~~x,您可能最好不要执行x|0 - 请参阅合并运算符~~和{{之间的差异1}}这里: