A short uses 16 bits, an int uses 32 and a long uses 64 bits. Given this, there are not unsigned values in Java, so if the most significant bit is 1, it means the value is negative.
Splitting the code you have:
file.readUnsignedShort()
<- reads 16 bits
<< 16
<- moves them 16 positions "to the left", adding zeros (it's like multiply by 2^16)
| file.readUnsignedShort();
<- in those 16 zeros, puts the next 16 bites read, using the OR operation, which works as follows:
xxxx0000 | 0000YYYY = xxxxYYYY