按位右移和左移可实现大幂

ank*_*hoi 2 java bitwise-operators

byte b = 5;
int n = 33;
b<<n
b>>n
Run Code Online (Sandbox Code Playgroud)

我知道如何计算:如果这是左移,那么我们需要将数字乘以 2 的 n 次方,对于右移,我们必须将数字除以 2 的 n 次方。

如果n是小数我可以计算。有人可以解释一下如果 n 很大(比如这里是 33)如何手动计算它,或者还有其他方法吗?

fge*_*fge 5

如果您的右操作数大于 31,那么您可以使用 along代替int。其值介于 -2^63 和 2^63 - 1 之间。

请注意>>,它并不会按照您直觉认为的那样进行操作。它带有符号位!

例如,在一个短片中,内容如下:

1000 0101
Run Code Online (Sandbox Code Playgroud)

右移 3 将给出完全违反直觉的结果:

1111 0001
Run Code Online (Sandbox Code Playgroud)

代替:

0001 0001
Run Code Online (Sandbox Code Playgroud)

如果您想要“真正的”右移,请>>>改为使用。

如果它比这个更大,你必须使用BigInteger

final BigInteger b1 = new BigInteger("5");
Run Code Online (Sandbox Code Playgroud)

BigIntegerhas.shiftLeft().shiftRight()方法(相当于 Java 的<<and >>>——注意>整数基元类型上的三元组)。请注意,这些操作将返回一个新的 BigInteger!所以,不要这样做:

b1.shiftLeft(33);
Run Code Online (Sandbox Code Playgroud)

这不会影响 的值b1。做:

final BigInteger b2 = b1.shiftLeft(33);
Run Code Online (Sandbox Code Playgroud)

  • 呃?那没有什么关系!! (2认同)