1 回答

TA貢獻1789條經驗 獲得超10個贊
按位運算符的工作方式完全符合您的預期。它們是嚴格的位運算符,根本不考慮位的語義。
有時,使用斷點運行代碼最為簡單。對于您的具體示例,我將操作的步驟轉換為原子語句,并使用 打印結果。Long.toString
int x = -57;
// step 1:
long xCast = (long) x;
System.out.println(Long.toString(xCast, 2)); // -1110011 - this is not the bitwise representation however.
long mask = 0xffffffffL;
System.out.println(Long.toString(mask, 2)); // 11111111111111111111111111111111
// step 2:
long result = ((long) x) & mask;
System.out.println(Long.toString(result, 2)); // 11111111111111111111111111000111
步驟 1 是操作外觀的主要原因。在 Java 中,所有(嚴格數字)值都是有符號的(字符是無符號的)。這意味著,正如您正確指出的那樣,所有最高位都是符號位。然而,有趣的部分是,如果一個數字是負數,那么其余位會做什么。以下主題已經涵蓋了“二的補碼”的基礎知識:什么是“2的補碼”?這個維基百科頁面也是如此:https://en.wikipedia.org/wiki/Two%27s_complement
為了縮短它,在java中,對于整數:
int zero = 0; // == 0b00000000_00000000_00000000_00000000
int maxPositive = Integer.MAX_VALUE; // == 0b01111111_11111111_11111111_11111111
int minus1 = -1; // == 0b11111111_11111111_11111111_11111111
int minNegative = Integer.MIN_VALUE; // == 0b10000000_00000000_00000000_00000000
因此,一切正常的原因是,如果整數為負數,則在強制轉換時,整個上部 32 位將轉換為 1,否則數字的表示值將發生變化。有效:
int x = 0b11111111_11111111_11111111_11000111;
轉換為:
long xCast = 0b11111111_11111111_11111111_11111111_11111111_11111111_11111111_11000111;
由于您作為開發人員希望該方法僅返回初始設置的位,因此您必須從結果中屏蔽上位。這是在步驟 2 中完成的。
因此,您的示例的答案:Java中非浮動值的表示是二的補碼,因此,當智能地將值從int轉換為long時,對于負數,上面的位被1填充。因此,它們必須被刪除。
添加回答
舉報