java移位运算

     移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。

 运算符       含义       例子      
<< 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) x<<3
>> "有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1. x>>3
>>> "无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0. x>>>3

  在java中,byte,short,long 在移位运算时,先将各自类型转换成int,转换成二进制计算后,在转换成对应的类型。

  如: 3<<3 = 0000 0011 * 2^3 = 0001 1000 = 24  ,即 向左移动三位,低位补0

     24 >> 3 = 0001 1000 / 2^3  = 0000 0011 = 3, 即 向右移动三位,高位补0  

    x<<y 相当于 x*2;x>>y相当于x/2y

      从计算速度上讲,移位运算要比算术运算快。
      如果x是负数,那么x>>>3没有什么算术意义,只有逻辑意义。

  在 java 中,int 类型的数据长度为 32 位,如果将 int 类型左移或者右移大于或等于 32 位时,并不会像预计的那样将数据全部填充为1或0。java 的处理方式是:当刚好为数据长度的整数倍时,即32、64······,数据保持原来不变;其他情况下移动除以 32 余数的长度。同理 long 类型数据以 64 为变化基准。 
在实际应用中,需要特别注意这点,当然也可以巧用此特性实现一些特殊算法的设计。

 运算符       含义       例子      
<< 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) x<<3
>> "有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1. x>>3
>>> "无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0. x>>>3

  在java中,byte,short,long 在移位运算时,先将各自类型转换成int,转换成二进制计算后,在转换成对应的类型。

  如: 3<<3 = 0000 0011 * 2^3 = 0001 1000 = 24  ,即 向左移动三位,低位补0

     24 >> 3 = 0001 1000 / 2^3  = 0000 0011 = 3, 即 向右移动三位,高位补0  

    x<<y 相当于 x*2;x>>y相当于x/2y

      从计算速度上讲,移位运算要比算术运算快。
      如果x是负数,那么x>>>3没有什么算术意义,只有逻辑意义。

  在 java 中,int 类型的数据长度为 32 位,如果将 int 类型左移或者右移大于或等于 32 位时,并不会像预计的那样将数据全部填充为1或0。java 的处理方式是:当刚好为数据长度的整数倍时,即32、64······,数据保持原来不变;其他情况下移动除以 32 余数的长度。同理 long 类型数据以 64 为变化基准。 
在实际应用中,需要特别注意这点,当然也可以巧用此特性实现一些特殊算法的设计。

猜你喜欢

转载自www.cnblogs.com/ztnn/p/8987440.html
今日推荐