Java 按位右移和左移可实现大功率 字节b=5; int n=33; bn
我知道如何计算:如果这是一个左移位,那么我们需要将这个数字乘以2的幂n,对于右移位,我们必须将这个数字除以2的幂nJava 按位右移和左移可实现大功率 字节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将产生
如果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