我正在使用Java进行任务,我们的讲师为我们提供了示例代码。我无法理解一些代码,所以任何人都可以解释一下吗?
private long magic;
private int minor;
magic = file.readUnsignedShort() << 16 | file.readUnsignedShort();
mnior = file.readUnsignedShort();
我不明白为什么他会为这两个人使用“readUnsignedShort”,为什么他会添加 “&lt;&lt; 16 | file.readUnsignedShort()”用于魔法。任何帮助将不胜感激
答案 0 :(得分:4)
short使用16位,int使用32位,long使用64位。 鉴于此,Java中没有无符号值,因此如果最高有效位为1,则表示该值为负。
拆分您拥有的代码:
file.readUnsignedShort()
&lt; - 读取16位
<< 16
&lt; - 向左移动16个位置“,添加零(就像乘以2 ^ 16)
| file.readUnsignedShort();
&lt; - 在这16个零中,使用OR操作读取接下来的16个叮咬,其操作如下:
xxxx0000 | 0000YYYY = xxxxYYYY
答案 1 :(得分:1)
这个操作就像比特一样。
short是16位,整数是32位长。连接2短,你将获得一个整数。
&lt;&lt;运算符代表bitshift,这样你就可以将位移16个位置。
示例:
NUMBER1 1111 1111 1111 1111
NUMBER2 0000 0000 0000 0000
NUMBER1 << 16 | NUMBER2 = 1111 1111 1111 1111 0000 0000 0000 0000
(感谢提示)
答案 2 :(得分:1)
好的,让我们从头开始。
RandomAccessFile.readUnsignedShort()
从文件中读取16位信息,而不将其解释为2s complement representation。<first two bytes of the file> << 16 | <third and fourth bytes of the file>
<<16
表示将数字左移16位。对于无符号数,这相当于乘以65536。|
表示按位或按位。因为我们知道第一个数字被移位了,在我们的例子中,这相当于只添加数字。所以这就是它的作用,它为什么会这样做是任何人的猜测。你应该真的问你的老师,但我的猜测是,这可能与通过RandomAccessFile
读取32位无符号数的唯一方法有关。
答案 3 :(得分:0)