作者softwind (softwind rising)
看板java
标题Re: [问题] bytes 转 integer
时间Fri Jun 2 19:11:07 2006
※ 引述《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
1F:推 PsMonkey:我是不会因为你引我文但是写跟我无关的文而战你啦... :P 06/02 19:28
2F:→ PsMonkey:我懒得看 bit-shift 的东西,不过有感受到你写文的诚意.. 06/02 19:28