Java 按位右移和左移可实现大功率 字节b=5; int n=33; bn

Java 按位右移和左移可实现大功率 字节b=5; int n=33; bn,java,bitwise-operators,Java,Bitwise Operators,我知道如何计算:如果这是一个左移位,那么我们需要将这个数字乘以2的幂n,对于右移位,我们必须将这个数字除以2的幂n 如果n是一个小数字,我可以计算。有人能给我解释一下,如果n很大(比如这里是33),如何手动计算它,或者有其他方法吗?如果右操作数大于31,则可以使用长而不是int。其值介于-2^63和2^63-1之间 注意>,它不会做你直觉上认为它会做的事。它带有符号位 例如,在一篇短文中: byte b = 5; int n = 33; b<<n b>>n 右移3将产生

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


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

如果右操作数大于31,则可以使用
而不是
int
。其值介于-2^63和2^63-1之间

注意
>
,它不会做你直觉上认为它会做的事
。它带有符号位

例如,在一篇短文中:

byte b = 5;
int n = 33;
b<<n
b>>n
右移3将产生完全违反直觉的结果:

1000 0101
而不是:

1111 0001
如果您想要“真正”右移,请使用
>

如果它比这个还要大,你必须使用:

BigInteger
.shiftLeft()
.shiftRight()
方法(Java的
等价物——注意整数基元类型上的三重
)。请注意,这些操作将返回一个新的
大整数
!所以,不要这样做:

final BigInteger b1 = new BigInteger("5");
这不会影响
b1
的值。做:

b1.shiftLeft(33);

如果右操作数大于31,则可以使用
long
而不是
int
。其值介于-2^63和2^63-1之间

注意
>
,它不会做你直觉上认为它会做的事
。它带有符号位

例如,在一篇短文中:

byte b = 5;
int n = 33;
b<<n
b>>n
右移3将产生完全违反直觉的结果:

1000 0101
而不是:

1111 0001
如果您想要“真正”右移,请使用
>

如果它比这个还要大,你必须使用:

BigInteger
.shiftLeft()
.shiftRight()
方法(Java的
等价物——注意整数基元类型上的三重
)。请注意,这些操作将返回一个新的
大整数
!所以,不要这样做:

final BigInteger b1 = new BigInteger("5");
这不会影响
b1
的值。做:

b1.shiftLeft(33);

使用
long
代替
byte

final BigInteger b2 = b1.shiftLeft(33);
长b=5;
int n=33;
系统输出打印项次(bn)//由于使用long,因此操作返回long

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

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

如果右操作数可以大于63,请使用


注意


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

使用
long
而不是
byte

final BigInteger b2 = b1.shiftLeft(33);
长b=5;
int n=33;
系统输出打印项次(bn)//由于使用long,因此操作返回long

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

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

如果右操作数可以大于63,请使用


注意


只允许整数类型(int、long、byte、short)作为移位运算符的操作数。基本上,您必须知道移位的含义

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

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
因此,您可以使用循环和数学乘法/除法:

要左移-乘法:

00000101 >> 1 = 00000010 = 2 (decimal) //shifting bits to the right
00000101 >> 3 = 00000000 = 0 (decimal)
字节b=5;
长数字=(字节)b;
int n=33;

对于(inti=0;i,基本上,你必须知道移位的意思

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

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
因此,您可以使用循环和数学乘法/除法:

要左移-乘法:

00000101 >> 1 = 00000010 = 2 (decimal) //shifting bits to the right
00000101 >> 3 = 00000000 = 0 (decimal)
字节b=5;
长数字=(字节)b;
int n=33;

对于(int i=0;i手动,对于左移,您仍然需要将其乘以2^n。猜猜看,对于右移,您仍然需要将其除以2^n,然后将结果取整。下面是手动执行的详细步骤:

  • 拿笔和纸
  • 写下你想换的号码
  • 将其转换为二进制基表示
  • 在其后面添加
    n
    0
  • 把数字转换回来
  • 或者,如果您不想使用二进制表示:

  • 拿笔和纸
  • 写下你想换的号码
  • 手动计算2^n。结果如下:1、2、4、8、16、32、64、128、256、512、1024、2048、4192
  • 把这个数乘以你刚才计算的那个数,这叫做长乘法

  • 手动操作时,您仍然需要将其乘以2^n才能进行左移。猜猜看,手动操作时,您仍然需要将其除以2^n并对结果进行四舍五入。下面是手动操作的详细说明:

  • 拿笔和纸
  • 写下你想换的号码
  • 将其转换为二进制基表示
  • 在其后面添加
    n
    0
  • 把数字转换回来
  • 或者,如果您不想使用二进制表示:

  • 拿笔和纸
  • 写下你想换的号码
  • 手动计算2^n。结果如下:1、2、4、8、16、32、64、128、256、512、1024、2048、4192
  • 把这个数乘以你刚才计算的那个数,这叫做长乘法

  • 呃,这根本不是你的问题所说的:/不使用任何像eclipse这样的IDE。呃?那没什么关系!!只是想知道为什么p