2 回答

TA貢獻1900條經驗 獲得超5個贊
JLS 第 15.19 節介紹了 Java 中的移位運算符。
如果左側操作數的提升類型是int,則只有右側操作數的五個最低位用作移位距離。就好像右手操作數經過按位邏輯 AND 運算符 & (§15.22.1) 和掩碼值0x1f( 0b11111)。因此,實際使用的移位距離總是在 到 的范圍內0,31包括 。
對于int諸如的值, 或 32304的位移值4*8實際上是0,因此不會發生位移。然后有點-and with 0xFFyield 48。
如果左側操作數的提升類型是long,則僅將右側操作數的最低六位用作移位距離。就好像右手操作數經過按位邏輯 AND 運算符 & (§15.22.1) 和掩碼值0x3f( 0b111111)。因此,實際使用的移位距離總是在 到 的范圍內0,63包括 。
對于一個long值, 的位移位值4*8確實向右移動了 32 位,從而產生0.
本頁介紹 JavaScript 位移運算符。
按位運算符將其操作數視為 32 位(零和一)的序列,而不是十進制、十六進制或八進制數。
似乎 JavaScript 將數字轉換為 32 位數字,如 Java int。同樣的“只有最少 5 位”規則似乎也適用于 JavaScript 中的移位操作數。
console.log(304>>32); // Don't shift!
console.log(0xFF&(304>>32)); // Don't shift!
console.log(304>>33); // Shift by 1, not 33
console.log(0xFF&(304>>33)); // Shift by 1, not 33

TA貢獻1799條經驗 獲得超8個贊
如果您想在 Java 中使用常量和變量獲得相同的結果,則需要將 304 作為 long 常量與 一起傳遞304L,如下所示:
System.out.println(304L>>(4*8));
System.out.println(0xFF&(304L>>(4*8)));
原因是你不能int用 4*8=32 位移動一個;Java 將移動 32 模 32 = 零但是,因為 anint只有 32 位長。
相比之下,Javascript 不支持使用>>運算符移動 64 位整數;它將您傳遞給的每個數字都>>視為 32 位整數。
您可以編寫自己的函數來執行類似的操作:
function rshift(num, bits) {
return Math.round(num / Math.pow(2,bits));
}
console.log(rshift(304, 4*8))
添加回答
舉報