64'th位對於PROGRAMM,我需要從第一位轉移到最後一位。 所以我需要:位位移在Java
long a = 0;
a |= 1L<<64;
由於long
不unsigned
,這是行不通的。是否有可能將1改爲最後一位?我正在long
而不是BigInt
,因爲我試圖用盡可能少的內存比可能。
64'th位對於PROGRAMM,我需要從第一位轉移到最後一位。 所以我需要:位位移在Java
long a = 0;
a |= 1L<<64;
由於long
不unsigned
,這是行不通的。是否有可能將1改爲最後一位?我正在long
而不是BigInt
,因爲我試圖用盡可能少的內存比可能。
首先,你的代碼不會做出很大的意義。如果你轉向一個long
量64位的左邊,你應該最終了零,因爲你已經轉移了所有的long
的原始位。其次,正如您已經正確提到的那樣,Java會將所有int
s和long
都視爲已燒錄(如所述here)。所以它認爲在long
64位移位到等於0的轉變。這是不是讓零,留給你爲什麼與原來的價值,這是1.如果要初始化a
到1
其次是63個零,我建議避免的變化,只是使用的東西是這樣的:
long a = 0x8000_0000_0000_0000L;
這是任何人誰明白二進制可讀,而且也沒有參與Java的移位魔術。
如果要使用轉向保持,只使用一個6 移來代替:
long a|=1L<<63;
移動由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
Java將通過num % sizeof(datatype)
只,即轉移。如果你移動了33,那麼有效的移動將是33 % 32 = 1
。
對於long
也是如此,只是long
的大小是64,因此移位64實際上沒有變化。最高的轉換可能與long
因此是63,這就是你需要得到的最後一位到第64位什麼(它已經是在位置1,所以你只需要63米的地方轉移)。
嘗試換檔通過63.自長具有64個位由64移位1將導致1,因爲Java的實際'your_value%的sizeof(類型)',這意味着在您的情況下,它通過移位'64%64 = 0'移動。 – Thomas
你的意思是63而不是?因爲除非我弄錯了,否則將它改爲64就會使其超出變量的長度。 – AntonH
其實'A | = 1L << 63'給出結果'-9223372036854775808'這可能是正確答案 – JeremyP