Re: [問題] bytes 轉 integer
※ 引述《Dancer31 (:p)》之銘言:
: ※ 引述《PsMonkey (痞子軍團團長)》之銘言:
恕刪
參考網址 http://www.javaworld.com.tw/jute/post/view?bid=29&id=49582&sty=3
小弟看了一下上面的網頁 好像有點怪怪的 剛好原PO貼到特例
下面是讀long的
public synchronized long readLong() throws IOException
{
this.in.readFully(w, 0, 8);
return (long) (w[7]) << 56
| (long) (w[6] & 0xff) << 48
| (long) (w[5] & 0xff) << 40
| (long) (w[4] & 0xff) << 32
| (long) (w[3] & 0xff) << 24
| (long) (w[2] & 0xff) << 16
| (long) (w[1] & 0xff) << 8
| (long) (w[0] & 0xff);
}
讀short的
public synchronized short readShort() throws IOException
{
this.in.readFully(w, 0, 2);
return (short) ((w[1] & 0xff) << 8 | (w[0] & 0xff));
}
觀察上面兩組函式 好像有點不太對稱
(很抱歉這麼說 請不要戰我 我也是要提問題的)
因為讀long是 先轉態 再作位移 在總共OR起來
但是讀short是 原陣列裡的數值先位移 再OR 最後用short傳回
依小弟寫過的C++的程式的經驗 (希望不會戰這個... 目前正在摸JAVA)
讀long的那個副程式才是正確的
因為如果沒有先轉態 則位移動作會將 該數值直接 "移到爆"
即發生如
move (byte ptr [MEM_ADDRESS]) to suitable_REG
suitalble_REG << 8
的情形
該數值運算結果為0
所以小弟的作法事先將 該數值轉態 再做位移
我想 long的return動作應該是正確的
return (long) (w[7]) << 56
| (long) (w[6] & 0xff) << 48
| (long) (w[5] & 0xff) << 40
| (long) (w[4] & 0xff) << 32
| (long) (w[3] & 0xff) << 24
| (long) (w[2] & 0xff) << 16
| (long) (w[1] & 0xff) << 8
| (long) (w[0] & 0xff);
那 int的return動作應該會對齊上面的寫法
return (int) (w[3]) << 24
| (int) (w[2] & 0xff) << 16
| (int) (w[1] & 0xff) << 8
| (int) (w[0] & 0xff);
short的
return (short) (w[1] & 0xff)<< 8
| (short) (w[0]);
不知道 小弟這樣說明 合不合適
----------------------------------------------
小弟看過 M$ VC6.0 編出組語碼 對於byte的運算指令會編成
mov EAX, [...]
and EAX, 0x000000ff
...其他對該byte數值的動作
會不會JAVA 沒有作這一步...? 這是我想問的部分...
感謝你的閱讀
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.129.36.82
推
06/02 19:28, , 1F
06/02 19:28, 1F
→
06/02 19:28, , 2F
06/02 19:28, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):