[英]Shifting a long by more than 31 bits (java)
如果我想將long
的第 37 位設置為 1,我相信我的代碼將如下所示:
long l = 0;
l |= 0b1 << 37;
但是,這不起作用,因為long
移位不能超過 31 位。 這讓我很困惑,因為 Oracle 文檔說 longs 是 64 位。 ( https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html )
我看過如何將 long 移位超過 32 位? ,但這似乎只適用於 c/c++。
我希望能夠為具有 64 位的數據類型切換位。 我將如何在 Java 中做到這一點?
long l;
l = 0;
l |= 0b1 << 37;
System.out.println(l);
// Outputs 32
l = 0;
l |= 0b1L << 37;
System.out.println(l);
// Outputs 137438953472
您遇到的問題是您的操作會像這樣崩潰:
l |= 0b1 << 37;
依次變成:
int _temp = 1 << 37;
l |= (long) _temp;
這樣做的原因是因為0b1
或任何缺少小數部分和尾隨字母以指示您想要的文字類型的數字文字(D/F/L 表示 double/float/long),因此是int
,句點. 然后將這個 int 值( 1
; 0b1
畢竟是寫1
一種奇怪方式)左移 37。左移規范指出,移位操作的右手運算符僅考慮低 5 位int 移位,低 6 為長移位。 因為否則你只會將值someInt << 37
0。因此, someInt << 37
是編寫someInt << 5
一種奇怪方式。
解決方案是確保您的輪班操作實際上發生在多頭上。 有很多很多方法可以做到這一點。
通過寫一個尾隨的 L。它可以寫在任何一種情況下,但是如果你使用小寫的 l,風格指南和開發人員會雞蛋你的房子,因為這太愚蠢了,不要這樣做。 它看起來像 1。因此:
l |= 1L << 37; // or if you must, 0b1L works too
long temp = 1;
temp <<= 37;
l |= temp;
l |= ((long) 0b1) << 37;
這些都將完成工作:它們最終都讓<<
操作處於“長模式”(如果 LHS 是 long 類型,就會發生這種情況,在所有這 3 個示例中都是如此)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.