java的算术右移(>>)、算术左移(<<)及逻辑右移(>>>,无符号移位)

  • 特别注意

特别注意:计算机运算是采用补码计算的。最后输出结果是运算结果后补码的原码。
本文所有的操作都是针对存储在计算机中中二进制的操作,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。

下表是原码补码反码相互转换规则。
在这里插入图片描述

  • 算术左移(<<):有符号的移位操作;该操作时将运算数的二进制码整体左移指定位数(<<符号左侧为运算数,右侧为移动位数),正数左移之后右侧的空位用0补充。如果是负数,移几位左边少几位,右边用0补齐。

  • 算术右移(>>):有符号的移位操作;该操作时将运算数的二进制码整体右移指定位数,移几位右边去掉几位。(>>符号左侧为运算数,右侧为移动位数),右移之后左侧的空位正数用0补充(可省略),负数用1补充。

  • 逻辑右移(>>>,无符号移位):无符号的移位操作;该操作时将运算数的二进制码整体右移指定位数,移几位右边去掉几位。(>>>符号左侧为运算数,右侧为移动位数),右移之后左侧的空位用0补充。

  • 简单举例

*****************算术左移(<<)****************
移位前: 4<<2     二进制为:0000 0100
移位后:结果为16   二进制为:0000 0100 00 (移了2位)结果为16 ,也相当于4*2*2=16
移位前:-4<<2     二进制为:1111 1100-4的补码)
移位后:结果为-16  二进制为:11111001010111100111100000000000
特别注意:-4的原码为 1000 0100
          -4的反码为 1111 1011
          -4的补码为 1111 1100
          左移2位得到   11 1100 00(补码)
          移位后的反码  1110 1111
          移位后的原码  1001 0000 
          移位后的原码 转换为2进制为 -16
*********************************************

*****************算术右移(>>)****************
移位前: 4>>3     二进制为:0000 0100  相当于4/2/2/2=0
移位后:结果为0  二进制为: 0000 0000 (右移了3位,去掉右边3位,正数左边补0)结果为0
移位前:-4>>3     二进制为:1111 1100-4的补码)
移位后:结果为-1  二进制为:11111001010111100111100000000000
特别注意:-4的原码为 1000 0100
          -4的反码为 1111 1011
          -4的补码为 1111 1100
          右移3位得到   1111 1111(补码)(右移3,去掉右边3位,负数左边补1)
          移位后的反码  1111 1110
          移位后的原码  1000 0001 
          移位后的原码 转换为2进制为 -1
*********************************************
  • 难度提升的例子分析,以全部移动11位为例
*****************算术左移(<<)****************
移位前:lnum1= 54321       二进制为:1101010000110001
移位后:lnum1= 111249408   二进制为:110101000011000100000000000  (移了11位)
移位前:lnum2= -54321      二进制为:11111111111111110010101111001111-54321的补码)
移位后:lnum2= -111249408  二进制为:11111001010111100111100000000000
特别注意:-54321的原码为 10000000 00000000  11010100 00110001
          -54321的反码为 11111111 11111111  00101011 11001110
          -54321的补码为 11111111 11111111  00101011 11001111
          左移11位得到   11111001 01011110  01111000 00000000(补码)
          移位后的反码   11111001 01011110  01110111 11111111
          移位后的原码   10000110 10100001  10001000 00000000
          移位后的原码 转换为2进制为 -111249408
*********************************************


*****************算术右移(>>)****************
移位前:num= 54321    二进制为:1101010000110001
移位后:num= 26       二进制为:11010  (右移11位,去掉右边11位)
移位前:num1= -54321  二进制为:11111111111111110010101111001111-54321的补码)
移位后:num1= -27     二进制为:11111111111111111111111111100101 
-54321的原码为 10000000 00000000  11010100 00110001
          -54321的反码为 11111111 11111111  00101011 11001110
          -54321的补码为 11111111 11111111  00101011 11001111
          右移11位得到   11111111 11111111  11111111 11100101(补码)
          移位后的反码   11111111 11111111  11111111 11100100
          移位后的原码   10000000 00000000  00000000 00011011
          移位后的原码 转换为2进制为 -27
*********************************************


*****************逻辑右移(>>>*****************
移位前:v1= 54321    二进制为:1101010000110001
移位后:v1= 26       二进制为:11010
移位前:v2= -54321   二进制为:11111111111111110010101111001111
移位后:v2= 2097125  二进制为:111111111111111100101
************************************************


  • 源代码
public class ShiftTest {
    public static void main (String args[]){
        ShiftTest st=new ShiftTest();
        st.ShiftTest();
    }
 
    public void ShiftTest(){
        System.out.println("*****************算术左移(<<)****************");
        int lnum1=54321;
        System.out.println("移位前:lnum1= "+lnum1+"  二进制为:"+Integer.toBinaryString(lnum1));
        lnum1=lnum1<<11;
        System.out.println("移位后:lnum1= "+lnum1+"  二进制为: "+Integer.toBinaryString(lnum1));
 
        int lnum2=-54321;
        System.out.println("移位前:lnum2= "+lnum2+"  二进制为:"+Integer.toBinaryString(lnum2));
        lnum2=lnum2<<11;
        System.out.println("移位后:lnum2= "+lnum2+"  二进制为: "+Integer.toBinaryString(lnum2));
 
        System.out.println("*********************************************");
        System.out.println("\n");
        System.out.println("*****************算术右移(>>)****************");
        int num=54321;
        System.out.println("移位前:num= "+num+"  二进制为:"+Integer.toBinaryString(num));
        num=num>>11;
        System.out.println("移位后:num= "+num+"  二进制为: "+Integer.toBinaryString(num));
 
        int num1=-54321;
        System.out.println("移位前:num1= "+num1+"  二进制为:"+Integer.toBinaryString(num1));
        num1=num1>>11;
        System.out.println("移位后:num1= "+num1+"  二进制为: "+Integer.toBinaryString(num1));
 
        System.out.println("*********************************************");
 
        System.out.println("\n");
        System.out.println("*****************逻辑右移(>>>)*****************");
        int v1=54321;
        System.out.println("移位前:v1= "+v1+"  二进制为:"+Integer.toBinaryString(v1));
        v1=v1 >>> 11;
        System.out.println("移位后:v1= "+v1+"  二进制为:"+Integer.toBinaryString(v1));
 
        int v2=-54321;
        System.out.println("移位前:v2= "+v2+"  二进制为:"+Integer.toBinaryString(v2));
        v2=v2 >>> 11;
        System.out.println("移位后:v2= "+v2+"  二进制为:"+Integer.toBinaryString(v2));
 
        System.out.println("************************************************");
    }
}
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值