2017-05-03 58 views
0

64'th位對於PROGRAMM,我需要從第一位轉移到最後一位。 所以我需要:位位移在Java

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

由於longunsigned,這是行不通的。是否有可能將1改爲最後一位?我正在long而不是BigInt,因爲我試圖用盡可能少的內存比可能。

+4

嘗試換檔通過63.自長具有64個位由64移位1將導致1,因爲Java的實際'your_value%的sizeof(類型)',這意味着在您的情況下,它通過移位'64%64 = 0'移動。 – Thomas

+0

你的意思是63而不是?因爲除非我弄錯了,否則將它改爲64就會使其超出變量的長度。 – AntonH

+0

其實'A | = 1L << 63'給出結果'-9223372036854775808'這可能是正確答案 – JeremyP

回答

0

首先,你的代碼不會做出很大的意義。如果你轉向一個long量64位的左邊,你應該最終了零,因爲你已經轉移了所有的long的原始位。其次,正如您已經正確提到的那樣,Java會將所有int s和long都視爲已燒錄(如所述here)。所以它認爲在long 64位移位到等於0的轉變。這是不是讓零,留給你爲什麼與原來的價值,這是1.如果要初始化a1其次是63個零,我建議避免的變化,只是使用的東西是這樣的:

long a = 0x8000_0000_0000_0000L;

這是任何人誰明白二進制可讀,而且也沒有參與Java的移位魔術。

如果要使用轉向保持,只使用一個6 移來代替:

long a|=1L<<63; 
1

移動由64位將有不轉移的效果。 由63個比特移位將具有期望的輸出。由B%64位 移上long v < < b位移。所以1L < < 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)); 
} 

預期輸出:如果通過32轉移的int這將有效地無移位都

1000000000000000000000000000000000000000000000000000000000000000 
1 
2

Java將通過num % sizeof(datatype)只,即轉移。如果你移動了33,那麼有效的移動將是33 % 32 = 1

對於long也是如此,只是long的大小是64,因此移位64實際上沒有變化。最高的轉換可能與long因此是63,這就是你需要得到的最後一位到第64位什麼(它已經在位置1,所以你只需要63米的地方轉移)。