Java中有趣的移位操作!彻底弄懂各个移位操作符的使用方式-阿里云开发者社区

开发者社区> 攻城狮Chova> 正文

Java中有趣的移位操作!彻底弄懂各个移位操作符的使用方式

简介: 本篇文章中介绍了Java中的移位的运算操作。包括左移运算,右移运算,无符号右移运算以及移位运算中的结果越界时的具体处理方式。最后介绍了移位操作的几个需要注意的点,包括移位中的操作数以及不同类型的操作数进行移位操作之后的类型问题。
+关注继续查看

<<

  • <<: 左移运算,左移几位就补几个0

>>

  • >>: 右移运算,为算术右移

    • 如果数字为正数时,移位后在前面补0
    • 如果数字为负数时,移位后在前面补1

>>>

  • >>>: 无符号右移,为逻辑右移.忽略符号,空位补0
  • 无符号右移规则: 忽略了符号位扩展,0补最高位,无符号右移运算符 >>> 只对32位和64位值有意义
  • 如果要移位的数是正数时:

    • 右移和无符号右移的值是一样的
  • 如果要移位的数是负数时:

    • 右移后的值还是负数
    • 无符号右移后的值则为正数
  • 区别:

    • 对于正数而言 ,>>>>> 没有区别
    • 对于负数而言,由于无符号右移忽略了最高位数的符号位.所以:

      • -2 >>> 1 = 2147483647(Integer.MAX_VALUE)
      • -1 >>> 1 = 2147483647(Integer.MAX_VALUE)
    • 因此要判断两个Integer类型的数符号是否相同,可以这样判断:
    return ((a >> 31) ^ (b >> 31)) == 0;

移位运算结果

  • 在不大于自身数值类型最大位数的移位时,一个数左移n位,就是将这个数乘以2n次幂
  • 一个数右移n位,就是将这个数除以2n次幂,然后取整

    • 如果移动位数超出自身数值类型的最大位数, 只要将移位数自身数值类型的最大位数取余得到的数字套用方法即可

注意

  • 三种移位运算作用的左操作数有五种:

    • long
    • int
    • short
    • byte
    • char
    • 在作用不同的操作数类型时的具体操作过程不同,遵循以下原则:

      • int移位时, 左操作数是32位,此时移位符号作用在32bit

        • 比如: 1 >> 3,是将00000000 00000000 00000000 00000001这32位向右移动3位
      • long移位时,左操作数是64位,此时移位符号作用在64bit
      • short,byte,char在移位之前首先将数据转换为int, 然后再移位,此时移位符号作用在32bit

        • 比如: (byte)0xff >>> 7,是将11111111 11111111 11111111 11111111这32位向右移动7位,得到的结果是00000001 11111111 11111111 11111111
  • 由上可知:

    • 当左操作数为long时,移位之后得到的类型是long
    • 当左操作数是其它四种类型时,移位之后得到的类型时int

      • 所以当左操作数是short,byte,char时,使用 >>=, >>>=, <<= . 其实是将得到的int做低位截取得到的数值,得到的值往往会错
  • 三种移位符号除了对左操作数有操作规则外,对右操作数也有操作规则:

    • 如果左操作数是int或者转换之后是int, 那么右操作数只有低5位有效,因为int总共就32

      • 22 >> 33 与 22 >> 1 的结果是一样的,都是11
    • 如果左操作数是long, 那么右操作数只有低6位有效

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8662 0
【Redis】Java中使用Jedis操作Redis(Maven导入包)、创建Redis连接池
转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 如果我们使用Java操作Redis, 需要确保已经安装了 redis 服务及 Java redis 驱动。
2365 0
java泛型操作复习,以及讲解在android中使用的场景
android使用泛型的地方很多,比如集成自BaseAdapter实现封装的Adapter,对常用操作进行封装,但是需要对传进来的数据进行处理,此时就使用到泛型,示例如下: public abstract class EasyAdapter extends BaseAdapter { ...
631 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10493 0
32_使用BeanUtils工具包操作JavaBean
由于对属性设置值和得到值的需求很多,使用频率很高,所以有一些开源勇士 不满足于JavaBean API 中IntroSpector来操作bean, 写出来了通用的BeanUtils工具,来进一步简化对java bean的操作,并开源放在apache网站上提供免费下载。
993 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
12305 0
Java技术周刊第15期:SpringBoot如何使用JPA操作数据库?
Java的开发者们:云栖社区已有5000位Java开发者,发布了30000+Java文章(文章列表),沉淀了7000+的Java精品问答(问答列表)。 Java技术周刊将会为大家介绍最新的Java技术与动态、预告活动、最热问答、直播教程等,欢迎大家订阅Java技术周刊。
16879 0
+关注
攻城狮Chova
一位有自我修养的攻城狮。 2006年《时代》周刊年度人物, 2008年感动中国组委会特别奖获得者。 专注分享技术干货,面试经验和攻城狮故事~ 欢迎点赞关注支持,是我持续进步的动力!
77
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载