之前没接触过java位运算.
字节数组转换为 short
private static short bytesToShort(byte[] bs)
{
    return (short)(bs[1] << 8 | (bs[0] & 0xff));  //为什么低位必须 & 0xff
}我的理解:bs[1] << 8(高位左移8位),然后与低位(bs[0])直接进行 | (或运算) 不就行了吗?
当然我的理解在测试下证明是错误的,为什么非要在低位先进行  & 0xff ?。

解决方案 »

  1.   

    等答案!0xFF 应该算8位,八位都是1,进行&运算不知道干嘛,数也没变,保持了原状态。
      

  2.   

    bs[0] & 0xff运算的时候会将bs[0]按符号为扩展为int类型如果bs[0]为负数,bs[0]扩展后前24位都是1,与oxFF与后,前24位就变成0了
      

  3.   

    如果不和oxFF与以下的话,前面24位还是1,然后再与bs[1] << 8做或操作得到的结果就截然不同了
      

  4.   

    规则:
    byte、short在做移位运算之前,会被自动转换为int类型
    byte、short经过移位运算后结果都为int型。
      

  5.   

    我看网上很多人是这么写的:private static short bytesToShort(byte[] bs)
    {
      return (short)(bs[1] << 8 & 0xff00 | (bs[0] & 0xff));  
    }但我测试发现:高8位倒没必要 & 0xff00,结果也一样,这又为什么?
      

  6.   

    bs[1] << 8
    假设bs[1]是11001011
    先转换成int:11111111 11111111 11111111 11001011
    左移8位    :11111111 11111111 11001011 00000000结果一样是因为强转为short了,你先把强转去掉,让返回值为int
    强转为short:11001011 00000000