黑马程序员技术交流社区
标题:
readInt
[打印本页]
作者:
胡威
时间:
2012-2-22 09:14
标题:
readInt
1. RandomAccessFile raf=new RandomAccessFile("xiaosan.txt","r");
2. byte[] b=new byte[4];
3. int i=raf.readInt();
7. System.out.println(i);
运行结果是825375031 怎么得出来的? (xiaosan.txt文件里只写了1297),请给出具体过程
作者:
李晓俊老师
时间:
2012-2-22 10:16
不懂,不过帮你顶
作者:
王--明
时间:
2012-2-22 10:22
1:首先判定下四个字符的范围,如果0 <= b1, b2, b3, b4 <= 255,则结果将等于:
(b1 << 24) | (b2 << 16) + (b3 << 8) + b4
2:raf.readInt(); 从此文件读取一个有符号的 32 位整数。
你自己在算下,我试了结果没问题的。
作者:
刘基军
时间:
2012-2-22 14:55
参考API:
public final int readInt()
throws IOException从此文件读取一个有符号的 32 位整数。此方法从该文件的当前文件指针开始读取 4 个字节。如果按顺序读取的字节为 b1、b2、b3 和 b4,其中 0 <= b1, b2, b3, b4 <= 255,则结果将等于:
(b1 << 24) | (b2 << 16) + (b3 << 8) + b4
在读取了这四个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
返回:
此文件的下四个字节,解释为一个 int。
作者:
胡威
时间:
2012-2-22 15:51
这“|”是什么意思,为什么要对b1,b2,b3,b4做这样的运算?
作者:
刘基军
时间:
2012-2-23 09:39
1.
"|",这边表示为:位运算符-“或”
2.
举例:
b1:00000000 00000000 00000000 00000001 (1)
b2:00000000 00000000 00000000 00000010 (2)
b3:00000000 00000000 00000000 00000011 (3)
b4:00000000 00000000 00000000 00000100 (4)
3.
接着我们根据它的计算公式验证确认结果:
(b1 << 24) | (b2 << 16) + (b3 << 8) + b4
(b1 << 24) :b1左右24位为:00000001
00000000 00000000 00000000
(b2 << 16):同理为:00000000 00000010
00000000 00000000
(b3 << 8):同理为:00000000 00000000 00000011
00000000
4.
计算(b1 << 24) | (b2 << 16) :(或,有一个为“1”,结果就是“1”)
00000001 00000000 00000000 00000000
00000000 00000010 00000000 00000000
结果:
00000001 00000010 00000000 00000000
计算 (b3 << 8) + b4:
00000000 00000000 00000011 00000000(768)
00000000 00000000 00000000 00000100(4)
00000000 00000000 00000011 00000100(772)
5.最后的结果:
00000001 00000010 00000000 00000000
00000000 00000000 00000011 00000100
则最后结果该为:
00000001 00000010 00000011 00000100
1 2 3 4
其实就是:将四个读取出的字节从高到低对应的存储进int型(占四个字节)数据中
作者:
胡威
时间:
2012-2-23 14:21
3Q,都快把或运算符忘了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2