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。从这个例子中咱们就知道了其实>>>=就是相似于+=这种操做,右移以后作了一个赋值。spa

总结

  其实移位操做在咱们平时用的并很少,可是在阅读JDK源码的时候常常会出现,好比concurrent包里的ThreadPoolExcutor、ConcurrentHashMap等。因此掌握移位操做以及原码、反码、补码、仍是颇有必要的。code

相关文章
相关标签/搜索