按位向右和向左移动以获得大功率

时间:2013-06-22 10:20:35

标签: java bitwise-operators

byte b = 5;
int n = 33;
b<<n
b>>n

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

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

4 个答案:

答案 0 :(得分:4)

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

并注意>>,它不会做你直觉认为它做的事情。它带有标志位!

例如,在一篇简短的文章中写道:

1000 0101

右移3将产生完全违反直觉的结果:

1111 0001

而不是:

0001 0001

如果您希望“真正”右移,请改用>>>

如果它甚至更大,你必须使用BigInteger

final BigInteger b1 = new BigInteger("5");

BigInteger.shiftLeft().shiftRight()方法(相当于Java的<<>>> - 请注意三重> - on整数原始类型)。请注意,这些操作将返回 BigInteger!所以,不要这样做:

b1.shiftLeft(33);

这不会影响b1的值。做:

final BigInteger b2 = b1.shiftLeft(33);

答案 1 :(得分:3)

使用long代替byte

long b = 5;
int n = 33;
System.out.println(b<<n);//n should be between 0 to 63
System.out.println(b>>n);//since you are using long,the operation returns long

如果左操作数为,则右操作数应介于 0到63之间

但如果左操作数不长,则右操作数应介于 0到31之间

如果您的右操作数大于63,请使用BigInteger


注意

只允许整数类型(int,long,byte,short)作为移位运算符的操作数

答案 2 :(得分:2)

嗯,基本上,你必须知道转移意味着什么。

如果你的数字5在内存中表示为0000101(位;字节有8位),则向左移位(乘法)如下所示:

00000101 << 1 = 00001010 = 10 (decimal) //shifting bits to the left
00000101 << 3 = 00101000 = 40 (decimal)

右移(分开):

00000101 >> 1 = 00000010 = 2 (decimal) //shifting bits to the right
00000101 >> 3 = 00000000 = 0 (decimal)

所以你可以使用循环和数学乘法/除法来做到这一点:

左移 - 乘以:

byte b= 5;
long number= (byte)b;
int n= 33;
for (int i=0; i<n; i++) {
    number= number * 2;
}

b = (byte)number;

同样如此,只需在for循环中除以而不是乘法。

答案 3 :(得分:0)

手动,你仍需要将它乘以2 ^ n左移。并且猜测一下,要手动进行右移,你仍需要除以2 ^ n并向下舍入结果。所以这里是手动详细说明:

  1. 拿笔和纸。
  2. 记下您要转移的号码。
  3. 将其转换为二进制基本表示。
  4. 在其后面添加n个零。
  5. 转回数字。
  6. 或者如果您不想使用二进制表示:

    1. 拿笔和纸。
    2. 记下您要转移的号码。
    3. 手动计算2 ^ n。它像:1,2,4,8,16,32,64,128,256,512,1024,2048,4192 ......
    4. 将数字乘以您刚刚使用this technique计算的数字。它被称为Long Multiplication。