zoukankan      html  css  js  c++  java
  • java >>> 和 >>>=的区别

    java >> 和 >>> 以及 >>>= 的区别

      可能大家都知道java中>> 和 >>> 的区别,那这里我也啰嗦一下,>> 和 >>> 都是右移操作,只不过>>>是无符号右移,也就是右移之后高位补零。对于正数来说,两者没有什么区别,但是对于负数来说,>> 右移之后还是负数,而>>>右移之后就变成了正数,大家可以参看一下例子:

     1 public class ShiftTest {
     2     public static void main(String[] args) {
     3         int n = 15;
     4         System.out.println(java.lang.Integer.toBinaryString(n));
     5         System.out.println(n >> 2);
     6         System.out.println(n >>> 2);
     7 
     8         int m = -15;
     9         System.out.println(java.lang.Integer.toBinaryString(m));
    10         System.out.println(m >> 2);
    11         System.out.println(m >>> 2);
    12     }
    13 }
     
    输出结果
     1111
     3
     3
     11111111111111111111111111110001
     -4
     1073741820

      此例以及结果大家一定也能看明白,唯一要注意的是计算机是以补码的形式存储的,大家可以去查看相关资料。那接下来就说一下 >>> 和 >>>= 的区别(因为有一次同学翻看ThreadLocal源码的时候,发现了cleanSomeSlots方法里有>>>=这个操作符,以前没有见过这个操作,只知道>>>是无符号右移,于是我们就讨论起来),我当时写了一段测试代码,如下所示:

     1 public class ShiftTest {
     2     public static void main(String[] args) {
     3         int n = -4;
     4         System.out.println(n >>>= 1);
     5         System.out.println(n >>> 1);
     6 
     7         int j = 4;
     8         System.out.println(j >>>= 1);
     9         System.out.println(j >>> 1);
    10     }
    11 }
    12 
    输出结果
     2147483646
     1073741823
     2
     1

      从此例中,大家可能比较疑惑了,第9行为什么会输出1,应该是2啊,我也比较纳闷,这个时候同学一点拨,就恍然大悟,其实j在第8行被重新赋值了成了2,而第9行再进行右移当然输出1。从这个例子中我们就知道了其实>>>=就是类似于+=这种操作,右移之后做了一个赋值。

    总结

      其实移位操作在我们平时用的并不多,但是在阅读JDK源码的时候经常会出现,比如concurrent包里的ThreadPoolExcutor、ConcurrentHashMap等。所以掌握移位操作以及原码、反码、补码、还是很有必要的。

  • 相关阅读:
    hdu4829 带权并查集(题目不错)
    hdu4829 带权并查集(题目不错)
    洛谷 P1076 寻宝(模拟 && 剪枝)
    洛谷 P1981 表达式求值(模拟)
    洛谷 P2239 螺旋矩阵(模拟 && 数学)
    洛谷 P2118 比例简化(枚举)
    洛谷 P3956 棋盘(记忆化搜索)
    洛谷 P5018 对称二叉树(搜索)
    洛谷 P5016 龙虎斗(模拟)
    洛谷 P1563 玩具谜题(模拟)
  • 原文地址:https://www.cnblogs.com/coder-yoyo/p/9584143.html
Copyright © 2011-2022 走看看