byte b = 5;
int n = 33;
b<<n
b>>n
我知道如何计算它:如果这是左移,那么我们需要将数字乘以2来加权n,对于右移,我们必须将数字除以2来加权n。
如果n是小数,我可以计算。如果n很大(比如这里是33),有人可以解释我如何手动计算它还是有其他方法吗?
答案 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并向下舍入结果。所以这里是手动详细说明:
n
个零。或者如果您不想使用二进制表示: