• 特别注意

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

下表是原码补码反码相互转换规则。

  • 算术左移(<<):有符号的移位操作;该操作时将运算数的二进制码整体左移指定位数(<<符号左侧为运算数,右侧为移动位数),正数左移之后右侧的空位用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("************************************************");}
}

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

  1. 算术左移,算术右移;逻辑左移,逻辑右移

    1.算术左移.逻辑左移 算术左移和逻辑左移一样都是右边补0 [例] 00101011 算术左移一位:01010110 逻辑左移一位:0101011 二进制数值,左移n位等于原来的数值乘以2的n次方 [ ...

  2. 逻辑左移,逻辑右移,算术左移,算术右移的区分

    逻辑左移(SHL)和算数左移(SAL),规则相同,右边统一添0    逻辑右移(SHR),左边统一添0     算数右移(SAR),左边添加的数和符号有关 (正数补0,负数补1)   比如一个有符号位 ...

  3. 算术右移()与逻辑右移()有什么区别

    逻辑右移就是不考虑符号位,右移一位,左边补零即可.算术右移需要考虑符号位,右移一位,若符号位为1,就在左边补1,:否则,就补0.所以算术右移也可以进行有符号位的除法,右移,n位就等于除2的n次方. 例 ...

  4. java 无符号右移_java中的无符号移位运算

    1. 无符号右移   >>>  或 >>> = 无符号右移(>>>)跟右移(>>)运算符不一样. 右移不改变数的正负. 对于一个正数, ...

  5. 逻辑左移、算术左移、逻辑右移、算术右移

    汇编指令: (注意,所有移位指令,被移出去的那个位上的值,会被赋值给CF标志位) 逻辑左移:SHL(右边补0) 算术左移:SAL(1.寄存器中自动转换成SHL,左移不存在算术左移,所有左移都是SHL: ...

  6. 逻辑左移、逻辑右移、算术左移、算术右移区别

    更新于20200715: 逻辑移位和算术移位不同,否则汇编指令就保留一个就行了,干嘛还保留2个呢? 因此: 逻辑移位主要用于无符号数的移位,左移和右移均是移丢一位+空位补0 算术移位主要用于有符号数的 ...

  7. 逻辑左移、逻辑右移、算术左移、算术右移、循环左移、循环右移

    逻辑左移时,最高位丢失,最低位补0: 逻辑右移时,最高位补0,最低位丢失: 算术左移时,依次左移一位,尾部补0,最高的符号位保持不变. 算术右移时,依次右移一位,尾部丢失,符号位右移后,原位置上复制一 ...

  8. 算数右移逻辑右移java的表示_java的算术右移()与逻辑右移()

    运算符">>"执行算术右移,它使用最高位填充移位后左侧的空位.右移的结果为:每移一位,第一个操作数被2除一次,移动的次数由第二个操作数确定. 逻辑右移或叫无符号右移运算 ...

  9. java中无符号右移怎么移_Java | java中>>(右移)和>>>(无符号右移)的区别...

    1. >> 右移 二进制码整体右移,如果最高位是0,左移空的位就填入0:如果最高位是1,右移空的位就填入1. 正数有符号右移 首先计算4>>2 将4转为二进制 0000 010 ...

最新文章

  1. C#与RSS亲密接触
  2. 提供第三种代码生成方式——通过自定义BuildProvider为ASP.NET提供代码生成
  3. 栈与队列5——汉诺塔问题
  4. Spring使用支付宝扫码支付
  5. Vue.js 单元测试
  6. 除了盖泡面,kindle还可以帮你提高科研效率
  7. poj 1061 青蛙的约会
  8. linux查看python环境变量_Linux中添加PYTHONPATH配置anaconda环境变量方法
  9. 山哥新作:架构师必备技能之业务分析
  10. AngularJS获取项目中定义的json文件
  11. python小型登录系统_python实现用户登录系统
  12. matlab 解相位_光测力学栅线投影技术-相位求解方法
  13. 学习(踩坑)记录——新建工程
  14. VS2017产品密钥
  15. 20135337——信息安全设计基础第十四周学习笔记
  16. Http协议简易分析
  17. UIApplication
  18. 解决eclipse编辑jsp、js文件时,经常出现卡死的问题
  19. 【数学建模】CUMCM-2011B model5 围捕方案确定
  20. smt贴片加工贴片机开机和贴片编程

热门文章

  1. Orion Solarwinds监控平台安装教程
  2. pg_hint_plan 使用hint固定SQL执行计划
  3. GO语言-第二节-顺序编程
  4. GYM 101350D. Magical Bamboos
  5. python list diff_Python List交集,并集,差集的应用
  6. ubuntu安装ROS进行到rosdep update时出现错误,如ERROR: unable to process source ...
  7. debussy与modelsim的联调设置
  8. Docker错误合集
  9. s6e3ha3 amoled屏
  10. Macbook做Wifi热点,用蓝牙分享