您的位置 首页 java

Java中的有趣操作:带你彻底弄清移位运算

Java中的移位运算

  • <<
  • >>
  • >>>
  • 移位运算结果
  • 注意
Java中的有趣操作:带你彻底弄清移位运算

<<

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

>>

  • >>: 右移运算,为算术右移如果数字为正数时,移位后在前面补 0 如果数字为负数时,移位后在前面补 1

>>>

  • >>>: 无符号右移,为逻辑右移.忽略符号,空位补0
  • 无符号右移规则: 忽略了符号位扩展,0补最高位,无符号右移运算符 >>> 只对 32 位和 64 位值有意义
  • 如果要移位的数是正数时: 右移和无符号右移的值是一样的
  • 如果要移位的数是负数时: 右移后的值还是负数符号右移后的值则为正数
  • 区别: 对于正数而言 ,>> >>> 没有区别对于负数而言,由于无符号右移忽略了最高位数的符号位.所以:-2 >>> 1 = 2147483647(Integer.MAX_VALUE)-1 >>> 1 = 2147483647( int eger.MAX_VALUE)因此要判断两个 Integer 类型的数符号是否相同,可以这样判断: return (( a >> 31 ) ^ ( b >> 31 )) == 0 ;

移位运算结果

  • 在不大于自身数值类型最大位数的移位时,一个数左移 n 位,就是将这个数乘以 2 n 次幂
  • 一个数右移 n 位,就是将这个数除以 2 n 次幂,然后取整如果 移动位数 超出 自身数值类型的最大位数, 只要将 移位数 自身数值类型的最大位数取余 得到的 数字 套用方法即可

注意

  • 三种移位运算作用的左操作数有五种:longintshortbytechar 在作用不同的操作数类型时的具体操作过程不同,遵循以下原则: int 移位时, 左操作数是 32 位,此时移位符号作用在 32 bit 比如: 1 >> 3,是将00000000 00000000 00000000 00000001这32位向右移动3位 long 移位时,左操作数是 64 位,此时移位符号作用在 64 bit short,byte,char 在移位之前首先将数据转换为 int, 然后再移位,此时移位符号作用在 32 bit 比如: (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 位有效

文章来源:智云一二三科技

文章标题:Java中的有趣操作:带你彻底弄清移位运算

文章地址:https://www.zhihuclub.com/182628.shtml

关于作者: 智云科技

热门文章

网站地图