Java中的位运算【转】

来源:互联网 发布:数控车圆球编程实例 编辑:程序博客网 时间:2024/05/21 15:34

转自http://hi.baidu.com/personnel/item/f17e835e58b8fd10db163550

问题1:

字节数组转换为 short
private static short bytesToShort(byte[] bs)
{
  return (short)(bs[1] << 8 | (bs[0] & 0xff)); //为什么低位必须 & 0xff
}

我的理解:bs[1] << 8(高位左移8位),然后与低位(bs[0])直接进行 | (或运算) 不就行了吗?
当然我的理解在测试下证明是错误的,为什么非要在低位先进行 & 0xff ?。

答案:

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

 

问题2:

网上一般都这么写

private static short bytesToShort(byte[] bs)
{
  return (short)(bs[1] << 8 & 0xff00 | (bs[0] & 0xff));   
}

但我测试发现,高8位没必要 & 0xff00,结果也是正确的。

解答:

bs[1] << 8
假设bs[1]是11001011
先转换成int:11111111 11111111 11111111 11001011
左移8位 :11111111 11111111 11001011 00000000

结果一样是因为强转为short了,你先把强转去掉,让返回值为int
强转为short:11001011 00000000

 

位运算符的优先级  

~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|。 

>>:

被移走的最高位由原来的最高位填补,正数的补0,负数的补1。这个就是符号位扩展,byte转化成int,正数则前面的24位都补0,负数则都补1

不错的文章:http://www.360doc.com/content/06/0803/20/8473_172708.shtml