今天在看ArrayList的源码的时候,突然发现有这样一个操作符 >> ,第一感觉就是C++里面的cout<< , cin>>,但貌似我看的JDK源码啊 = =。于是乎立马去百度百度,了解了下java中> , >> , >>> 三者的区别。以下是个人学习心得,个人学习记录,如有错误,欢迎大家纠正。
最常见的> 和 < ,就不在这里细说了啊。直接说>>的作用。在计算机中,各种机器数用二进制补码的形式存在,并且各种运算操作都转换乘补码形式的加法。而 int num = 5; num = num >> 1; 的意义为将num的的二进制补码右移一位,可想而知, num << 1 的意义为将Num的二进制补码左移一位。另外,稍微补充一下,正数的二进制补码形式无论左移或者右移都补0,负数的二进制补码形式左移补0,右移补1。
至于 >>>,意义就是无视符号位,右移。(值得注意的是,java好像并没有 <<< ,网上说是左移不会引起符号位变化,所以和 << 作用一样)
以下是例子。
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = -5;
System.out.println("first:");
toBinary(num);
System.out.println("Second:");
num = num >> 1;//右移一位
toBinary(num);
System.out.println("Third:");
num = -5;
num = num << 2;//左移2位
toBinary(num);
System.out.println("Forth:");
num = -5;
num = num >>> 1;//无视符号位右移一位
toBinary(num);
}
public static void toBinary(int i )
{
System.out.println(Integer.toBinaryString(i));
System.out.println("length:"+Integer.toBinaryString(i).length());
}
}
运行结果:
由于int 类型数占4个字节,即32位。最后的length:31 原因是忽略符号位右移一位,即可等同与正数二进制补码右移一位,添0, 0不做显示。