在Java中Bitshift到64位

时间:2017-05-03 14:58:12

标签: java bit-manipulation bit-shift

对于一个程序,我需要将位从第一位移到最后一位。 所以我需要:

long a = 0;
a |= 1L<<64;

由于long不是unsigned,因此不起作用。是否有可能将1移到最后一位?我正在使用long而不是BigInt,因为我试图使用尽可能少的内存。

3 个答案:

答案 0 :(得分:3)

Java只会移动num % sizeof(datatype),即如果你将int移到32,它实际上根本就没有移位。如果您移动33,则有效班次将为33 % 32 = 1

同样适用于long只是long的大小为64,因此移位64实际上没有移位。因此long可能的最高位移是63,这就是你需要将最后一位移到64位(它已经 位于第1位所以你只需要移位由63个地方)。

答案 1 :(得分:1)

64位移位会产生不移位的影响。 移位63位将具有所需的输出。 转移long v&lt;&lt; b按b%64位移位。所以1L <&lt;&lt; 64&lt; 64移位。

public static void main (String[] args) throws java.lang.Exception
{
    long a=1L<<63;
    long b=1L<<64;
    System.out.println(Long.toBinaryString(a));
    System.out.println(Long.toBinaryString(b));
}

预期产出:

1000000000000000000000000000000000000000000000000000000000000000
1

答案 2 :(得分:0)

首先,您的代码并没有多大意义。如果您将long变量向左移动了64个位置,那么应该最终为零,因为您已将所有long&#39; s原始位。

其次,正如您所正确提到的,Java将所有intlong视为已烧毁(如所述here)。因此它认为long上的64位移位等于0移位。这就是为什么不是为零,而是留下原始值,即1.如果你想将a初始化为1后跟63个零,我建议避免轮班,只是使用这样的东西:

long a = 0x8000_0000_0000_0000L;

任何了解二进制文件的人都可以阅读,并且不涉及Java位移动魔法。

如果您想继续使用班次,只需使用6 3 班次:

long a|=1L<<63;