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位有效
相关文章
|
7月前
|
Java
【面试题精讲】Java移位运算符
【面试题精讲】Java移位运算符
|
11天前
|
存储 Java 数据安全/隐私保护
【Java探索之旅】运算符解密 位运算,移位运算
【Java探索之旅】运算符解密 位运算,移位运算
20 0
|
28天前
|
存储 Java 编译器
Java基础教程(4)-Java中的操作符
【4月更文挑战第4天】Java中的String是常用类,字符串是不可变对象,用双引号表示。String对象在编译期长度受限于65535,运行期不超过Int范围。字符串方法如length()、substring()、replace()、equals()等提供了多种操作。可变字符串可使用StringBuffer或StringBuilder。String对象通过字符串池优化内存,池中已有相同内容字符串则返回其引用。
|
3月前
|
存储 设计模式 缓存
Java instanceof操作符:类型检查的必备工具
Java instanceof操作符:类型检查的必备工具
40 0
|
9月前
|
存储 Java 程序员
重温经典《Thinking in java》第四版之第三章 操作符(二十一)
重温经典《Thinking in java》第四版之第三章 操作符(二十一)
34 0
|
9月前
|
安全 Java 程序员
重温经典《Thinking in java》第四版之第三章 操作符(二十)
重温经典《Thinking in java》第四版之第三章 操作符(二十)
34 0
|
9月前
|
存储 人工智能 算法
重温经典《Thinking in java》第四版之第三章 操作符(十九)
重温经典《Thinking in java》第四版之第三章 操作符(十九)
51 0
|
9月前
|
Java
重温经典《Thinking in java》第四版之第三章 操作符(十八)
重温经典《Thinking in java》第四版之第三章 操作符(十八)
39 0
|
9月前
|
Java
重温经典《Thinking in java》第四版之第三章 操作符(十七)
重温经典《Thinking in java》第四版之第三章 操作符(十七)
36 0
|
9月前
|
Java
重温经典《Thinking in java》第四版之第三章 操作符(十六)
重温经典《Thinking in java》第四版之第三章 操作符(十六)
29 0