移位运算符

左移运算符(<<)

按二进制形式将运算符左边的运算对象向左移动运算符右侧指定的位数,高位移出(舍弃),低位的空位补0

  1. 正数

    //将20转成二进制为 00010100  (短除法计算十进制转二进制) 这里只显示了8位,共32位二进制
    //将二进制数向左移动两位,低位补零 01010000
    //再将01010000转成十进制 为80
    int i = 20;
    System.out.println(Integer.toBinaryString(i));  //10100
    i <<= 2;
    System.out.println(Integer.toBinaryString(i));  //1010000
    System.out.println(i); //80
    
  2. 负数

    //将20转成二进制为 00010100  (前16位缺省0)
    //-20的二进制是20二进制的补码(原码->反码(取反)->补码(加1)) 
    //取反:00010100 -> 11101011 , 加1:11101011 -> 11101100  (前16位缺省1)
    //将二进制数向左移动两位,低位补零  10110000
    //再将10110000转成十进制,负数的二进制是补码,得到原码的步骤是:补码->反码(补码-1)->原码(反码取反)
    //反码(补码-1) 10110000 ->  10101111, 原码(反码取反): 10101111 -> 01010000  转成十进制前面加负号 -80
    int i = -20;
    System.out.println(Integer.toBinaryString(i));  //11111111111111111111111111101100
    i <<= 2;
    System.out.println(Integer.toBinaryString(i));  //11111111111111111111111110110000
    System.out.println(i); //-80
    
右移运算符(>>)

按二进制形式将运算符左边的运算对象向右移动运算符右侧指定的位数,“有符号"右移位运算符使用了"符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1,低位移出(舍弃)。

  1. 正数

    //将20转成二进制为 00010100 
    //将二进制数向右移动两位,正数高位补0,00000101
    //再将00000101转成十进制 为5
    int i = 20;
    System.out.println(Integer.toBinaryString(i));  //110100
    i >>= 2;
    System.out.println(Integer.toBinaryString(i));  //101
    System.out.println(i); //5
    
  2. 负数

    //将20转成二进制为 00010100 
    //-20的二进制为 11101100    
    //将二进制数向右移动两位,正数高位补1,11111011
    //再将11111011转成十进制,负数的二进制是补码,得到原码的步骤是:补码->反码(补码-1)->原码(反码取反)
    //反码(补码-1) 11111011 ->  11111010, 原码(反码取反): 11111010 -> 00000101  转成十进制前面加负号 -5
    int i = -20;
    System.out.println(Integer.toBinaryString(i));  //11111111111111111111111111101100
    i >>= 2;
    System.out.println(Integer.toBinaryString(i));  //11111111111111111111111111111011
    System.out.println(i); // -5
    
无符号右移运算符(>>>)

按二进制形式将运算符左边的运算对象向右移动运算符右侧指定的位数,“无符号"右移位运算符使用了"零扩展”:无论正负都在高位插入0,低位移出(舍弃)。对于正数来说和有符号右移(>>) 相同,都是再高位插入0,但是对于负数来说不同。

  1. 负数

    因为负数的二进制最高位为1,而无符号右移要在最高位补0,所以要显示全32位二进制

    //-20的二进制:11111111111111111111111111101100
    //右移2位:    00111111111111111111111111111011
    //二进制 00111111111111111111111111111011 转成十进制结果为1073741819
    int i = -20;
    System.out.println(Integer.toBinaryString(i));  //11111111111111111111111111101100
    i >>>= 2;
    System.out.println(Integer.toBinaryString(i));  //111111111111111111111111111011
    System.out.println(i); // 1073741819
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值