移位操作符

移位操作符操作的运算对象也是 二进制的 "位",  只可用来处理整数类型.

 

左移位操作符 <<  能按照 操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0).

"有符号"  右移位操作符 >> 则按照操作符右侧指定的位数将操作符左边的操作数向右移动。  "有符号"  右移位操作符使用   "符号扩展", 若符号为正,则在高位插入0 , 若符号为负,

则在高位插入1, Java 中增加了一种 "无符号"  右移位操作符 >>>, 它使用 “零扩展”,   无论正负,都在高位插入0。 这一操作符是C++/C  没有的.  

  如果对char,  byte 或者short  类型的数值 进行移位处理,  在移位之前,它们会被转换为int 类型,  得到的结果也是int 类型的值,  只用数值的低 5位 才有用. 因为2的5次方为32, int 类型值只有 32位.若对long 类型的数值进行处理,最后得到的结果也是  long.此时只会用到数值右端的低 6位,  以防止移位超过 long 型数值具有的位数.

  "移位"  可与  "等号" (<<= 或 >>= 或>>>=)组合使用.此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量。 但在进行  “无符号” 右移位结合赋值操作时,可能会遇到一个问题:

    如果对 byte或 short  值进行这样的移位运算,  得到的可能不是正确的结果.  它们会先被转换成  int 类型. 再进行右移操作.然后被截断,赋给原来的类型. 在这种情况下可能得到 -1 的结果。
public class URShift {

 public static void main(String[] args) {
  int i = -1;
  print(Integer.toBinaryString(i));
   i >>>=10;
   print(Integer.toBinaryString(i));
  
   long l = -1;
   print(Long.toBinaryString(l));
   l >>>=10;
   print(Long.toBinaryString(l));
  
   short s = -1;
   print(Integer.toBinaryString(s));
   s >>>=10;
   print(Integer.toBinaryString(s));
  
   byte b = -1;
   print(Integer.toBinaryString(b));
   b >>>=10;
   print(Integer.toBinaryString(b));
   b = -1;
   print(Integer.toBinaryString(b));
   print(Integer.toBinaryString(b>>>10));
 }
 
 private static void print (Object obj){
  System.out.println(obj);
 }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值