对于一个程序,我需要将位从第一位移到最后一位。 所以我需要:
long a = 0;
a |= 1L<<64;
由于long
不是unsigned
,因此不起作用。是否有可能将1移到最后一位?我正在使用long
而不是BigInt
,因为我试图使用尽可能少的内存。
答案 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将所有int
和long
视为已烧毁(如所述here)。因此它认为long
上的64位移位等于0移位。这就是为什么不是为零,而是留下原始值,即1.如果你想将a
初始化为1
后跟63个零,我建议避免轮班,只是使用这样的东西:
long a = 0x8000_0000_0000_0000L;
任何了解二进制文件的人都可以阅读,并且不涉及Java位移动魔法。
如果您想继续使用班次,只需使用6 3 班次:
long a|=1L<<63;