亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 十六進制計算

Java 十六進制計算

守候你守候我 2022-01-19 17:16:02
我有這樣聲明的long值bits:long bits = len*8L; (304)System.out.println(bits); 這輸出為 304如果我像這樣使用長名稱位,我分別得到 0 和 0。System.out.println(bits>>(4*8));System.out.println(0xFF&(bits>>(4*8)));如果我使用實際數字,像這樣,我分別得到 304 和 48System.out.println(304>>(4*8));System.out.println(0xFF&(304>>(4*8)));我正在嘗試將此 Java 轉換為 JavaScript,但 JavaScript 在所有情況下都為我提供 304 和 48。我需要它來匹配 Java 并給出 0 和 0 的值。編輯跟進,為了清楚起見,我需要等效于等于 0 的 JavaScript,模仿 Java 當前的操作方式(上面兩個等于 0 的示例在我們正在開發的內容中不會改變)。所以 console.log(0xFF&(bits>>(4*8))) 應該等于 0,它目前等于 48
查看完整描述

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


查看完整回答
反對 回復 2022-01-19
?
守著星空守著你

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))


查看完整回答
反對 回復 2022-01-19
  • 2 回答
  • 0 關注
  • 565 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號