http://blog.csdn.net/dandanteng/article/details/7433531

首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。

左移位:<

左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充

右移位:>>,有符号的移位操作

右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。

例子:

public static void main(String[] args)

{

System.out.println(3<<2);//3左移2位

System.out.println(-3<<2);//-3左移2位

System.out.println(6>>2);//6右移2位

System.out.println(-6>>2);//-6右移2位

}

输出结果

12

-12

1

-2

下面解释一下:

00000000 00000000 00000000 00000011 +3在计算机中表示

00000000 00000000 00000000 0000001100 左移2位,补0,结果为12

----------------------------------------------------------------------------------------------

00000000 00000000 00000000 00000011 +3在计算机中表示

11111111 11111111 11111111 11111100

11111111 11111111 11111111 11111101 -3在计算机中表示

11111111 11111111 11111111 1111110100 左移2位,补0,结果为负数,就是补码了,求原码

10000000 00000000 00000000 00001011

10000000 00000000 00000000 00001100 结果-12

----------------------------------------------------------------------------------------------

这也说明了一个问题:在计算机中,以1开头的就是补码的形式,是负数。

00000000 00000000 00000000 00000110 +6在计算机中表示方法

0000000000 00000000 00000000 00000110 右移两位,正数补0,结果为1

----------------------------------------------------------------------------------------------

00000000 00000000 00000000 00000110 +6在计算机中表示方法

11111111 11111111 11111111 11111001

11111111 11111111 11111111 11111010 -6在计算机中的表示

1111111111 11111111 11111111 11111010 右移两位,结果为负数

1000000000 00000000 00000000 000001

1000000000 00000000 00000000 000010 结果为-2

这个地方很容易弄混,多想几次就会慢慢理解了。

上面解释了带符号的移位操作,下面解释一下不带符号的移位操作

无符号的移位只有右移,没有左移使用“>>>”进行移位,都补充0

例如:

public static void main(String[] args)

{

System.out.println(6>>>2);

System.out.println(-6>>>2);

}

结果:

1

1073741822

分析:

00000000 00000000 00000000 00000110 +6在计算机中表示方法

0000000000 00000000 00000000 00000110 右移两位,正数补0,结果为1

-----------------------------------------------------------------------------------------------------

00000000 00000000 00000000 00000110 +6在计算机中表示方法

11111111 11111111 11111111 11111001

11111111 11111111 11111111 11111010 -6在计算机中的表示

0011111111 11111111 11111111 11111010 右移两位,补充0,结果为1073741822

可以参考

移位操作要注意的问题是高(低)位是补0还是补1和对char, byte, short型的操作:

(1)<< : (left-shift), 最低位补0

(2)>> : (signed right-shift), 右移过程使用符号位扩展(sign extension),即如果符号为为1则高位补1, 是0则补0,也就是逻辑右移

(3)>>> : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移

(4)移位操作的数据类型可以是byte, char, short, int, long型,但是对byte, char, short进行操作时会先把它们变成一个int型,最后得到一个int型的结果,对long型操作时得到一个long型结果,不可以对boolean型进行操作。

(5)移位操作符可以和=合并起来,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示将a右移两位后的值重新赋给a。当时在使用这三个操作符对 byte, char, short型数据进行操作时要注意,例如有一下代码片段:

public class ShiftTest

{

public static void main(String [] args)

{

byte a;

byte b;

byte c;

a = 127;

b = 127;

c = 127;

a <<= 2;

System.out.println(a);

System.out.println(b <<= 2);

System.out.println(c <

}

}

运行结果是:

-4

-4

508

这说明了在操作a <<= 2 执行过程是这样的:先将 byte型的数 127变成int型,左移2位得到 508,然后把508赋给byte型变量a时只是简单地"折断"(truncate)得到数-4。编译时编译器不会提示你可能损失精度(实际上在本例中确实是损失精度了),但是如果你把a <<= 2改成 a = a << 2;编译器就会提示可能损失精度了。

================================================================================

移位操作的简单计算方法

>>右移操作

x>>y

就是x除以2的y此方,取整数

<

X<

就是x乘以2的y次方

java 右移两位_java左移右移运算符相关推荐

  1. java中的 31 和左移右移的关系简述

    java中的 31 和左移右移的关系简述 任何数乘以31 等于 这个数左移 五位 减去这个数 ​ n * 31 == (n << 5) - n " << " ...

  2. 字符串右移n位,例如 “hello world“ 右移两位 后ldhello wor 要求写一个方法实现此功能,方法的格式是 String moveToRight(String str,int po

    字符串右移n位,例如 "hello world" 右移两位 后ldhello wor 要求写一个方法实现此功能,方法的格式是 String moveToRight(String s ...

  3. java保留两位小数_java使double保留两位小数的多方法 java保留两位小数

    这篇文章主要介绍了java使double类型保留两位小数的方法,大家参考使用吧 mport java.text.DecimalFormat; DecimalFormat df = new Decima ...

  4. java中想要保留2位小数_java使double保留两位小数的多方法 java保留两位小数

    mport java.text.DecimalFormat; DecimalFormat    df   = new DecimalFormat("######0.00"); do ...

  5. java保留二位小数_java使double保留两位小数的多方法 java保留两位小数

    复制代码代码如下: mport java.text.DecimalFormat; DecimalFormat    df   = new DecimalFormat("######0.00& ...

  6. java保留两位小数怎么_java保留两位小数4种方法

    java保留两位小数4种方法 Java中保留小数有四种方法,如下: public class Format { double f = 23065.57845; public void m1() { B ...

  7. java最多保留两位小数_java使double保留两位小数的多方法 java保留两位小数

    这篇文章主要介绍了java使double类型保留两位小数的方法,大家参考使用吧mport java.text.DecimalFormat; DecimalFormat    df   = new De ...

  8. java保留两位小数

    2019独角兽企业重金招聘Python工程师标准>>> java保留两位小数 博客分类: java java保留两位小数问题: 方式一: 四舍五入   double   f   =  ...

  9. 使double保留两位小数的多方法 java保留两位小数

    import java.text.DecimalFormat; DecimalFormat df = new DecimalFormat("######0.00"); double ...

最新文章

  1. POCO:InvalidOperationError:Mapping and metadata information could not be found for Entity Type
  2. 【已完结!】Java基础--学习笔记(零起点打开java世界的大门)--博客汇总表【附:视频、工程源码、资料、详细笔记】
  3. 《JavaScript入门经典(第4版)》上第5章一个实例程序的修正,完善
  4. 最为完整的gdb调试
  5. java.lang.ClassNotFoundException: org.springframework.web.util.WebAppRootListener
  6. 基于C#的在线语音识别软件开发
  7. C/C++ 二维数组传参方法总结
  8. Twitter是什么软件?哪个国家的?怎么使用?免费吗?
  9. ui设计需要做android和苹果版本,安卓和IOS系统对于UI设计来说一样吗
  10. echarts中月份数据缺少怎么补齐呢?
  11. Linux服务器下搭建SFTP服务
  12. Mysql时间函数用法
  13. SpringMVC返回数据到页面的方法
  14. LayaAir基础(7) 之 .ani动画文件
  15. android复读机功能,点滴复读机最新版-点滴复读机app下载v3.0.1 安卓版-腾牛安卓网...
  16. JavaScript------JS相关难题,做对一半算你牛牪犇
  17. SMETA验厂辅导,提出过不合规项的所有部分,应对以下内容有清楚的解释
  18. AirDisk产品Q3C和T2硬盘不认的时候,一般就三种原因
  19. 刘汝佳 例题7-2 最大乘
  20. 2021年中国航空飞机数量、航空器数量及航空维修主要企业经营对比分析[图]

热门文章

  1. C#与时间有关的一些方法
  2. 配置apache虚拟主机
  3. Winform将网页生成图片
  4. javaweb学习总结(四十三)——Filter高级开发
  5. SQL Server 动态生成数据库所有表Insert语句
  6. memcached协议
  7. windows2008下 IIS7 HTTP 错误 404.2 - Not Found 解决方法(图文)
  8. 鸿蒙自研系统,华为已注册“华为鸿蒙”商标,自研操作系统最快秋季发布
  9. java 交互输入_JAVA -----------交互式程序
  10. 打开黑色_表哥出差带回来一箱苹果,打开后发现是黑色的,大家表示都没见过...