【发布时间】: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
我最近在 BigInteger Java 类中学习了一个方法,叫做
BigInteger.testBit(n)
它的主要功能是(this & (1<<n)) != 0),但是我不太明白源码
return (getInt(n >>> 5) & (1 << (n & 31))) != 0;
谁能解释一下?
【问题讨论】:
标签: java bit biginteger
我不熟悉它是如何实现的,但从该代码来看,我会假设 BigInteger 是通过将其值存储在整数列表中来实现的,getInt(n) 返回其中的第 n 个,其中0 = 最不重要。
第一个将存储最低有效 32 位,getInt(1) 将存储 32-63 位等。通过将 n 右移 5,您将获得内部列表中包含您关心的位的整数的索引about, 相当于 n div 32。
使用该整数,然后您可以使用(1 << (n & 31)) 从中挑选出您关心的位。 n & 31 相当于 n 模 32,1 << 相当于 2^。这为您提供了一个位掩码,可以精确选择您关心的位。
【讨论】:
1 << (n & 31),因为移位被自动屏蔽到低 5 位。
getInt 函数的调用不会先将 n 移动 5,然后将其传入。n 的值由执行 @ 的表达式部分使用987654329@ 没有被转移,它仍然与最初传递给 testBit 函数一样。
1 << n中,无论如何只会使用n的低5位(掩码31或0x1F),所以1 << (n & 31)等价于1 << n,因为运行时已经屏蔽了低5位。