【问题标题】:Bit manipulation in BigIntegerBigInteger 中的位操作
【发布时间】:2015-11-18 04:53:22
【问题描述】:

我最近在 BigInteger Java 类中学习了一个方法,叫做

BigInteger.testBit(n)

它的主要功能是(this & (1<<n)) != 0),但是我不太明白源码

return (getInt(n >>> 5) & (1 << (n & 31))) != 0;

谁能解释一下?

【问题讨论】:

    标签: java bit biginteger


    【解决方案1】:

    我不熟悉它是如何实现的,但从该代码来看,我会假设 BigInteger 是通过将其值存储在整数列表中来实现的,getInt(n) 返回其中的第 n 个,其中0 = 最不重要。

    第一个将存储最低有效 32 位,getInt(1) 将存储 32-63 位等。通过将 n 右移 5,您将获得内部列表中包含您关心的位的整数的索引about, 相当于 n div 32。

    使用该整数,然后您可以使用(1 &lt;&lt; (n &amp; 31)) 从中挑选出您关心的位。 n & 31 相当于 n 模 32,1 &lt;&lt; 相当于 2^。这为您提供了一个位掩码,可以精确选择您关心的位。

    【讨论】:

    • 我有点惊讶他们做了1 &lt;&lt; (n &amp; 31),因为移位被自动屏蔽到低 5 位。
    • 该位与移位无关,它只是用掩码仅挑选出最低 5 位。
    • @Flynn1179:这就是路易斯所说的:没有必要屏蔽掉,因为移位值已经屏蔽到低 5 位。
    • @RudyVelthuis:不,对 getInt 函数的调用不会先将 n 移动 5,然后将其传入。n 的值由执行 @ 的表达式部分使用987654329@ 没有被转移,它仍然与最初传递给 testBit 函数一样。
    • @Flynn1179:我知道。但是在1 &lt;&lt; n中,无论如何只会使用n的低5位(掩码31或0x1F),所以1 &lt;&lt; (n &amp; 31)等价于1 &lt;&lt; n,因为运行时已经屏蔽了低5位。
    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多