位运算符中,<<和>>运算符将位模式左移或者右移,使用这种运算符有些时候会进行非常快速的运算。<<表示左移乘2,>>表示右移除2
- int a = 256 * 100;那么a就为100个256相加。
- 对于位运算原理来说,100 = 64 + 32 + 4 = 2^6 + 2^5 +2^2
a = 256 * ( 2^6 + 2^5 +2^2)= 256 * 2^6 + 256 * 2^5 + 256 * 2^2
= (256<<6) + (256<<5) + (256<<2)
<<运算符后面跟的是2的多少次幂
光说可能没有特别的感官,我们用代码来测试一下。
public class Test {
public static void test1(){
double start = System.currentTimeMillis();
int a = 0;
for(int i = 0;i<50000;i++) {
a += 256 * 100;
}
System.out.println(a);
double end = System.currentTimeMillis();
System.out.println("运行时间: " + (end - start));
}
public static void test2(){
double start = System.currentTimeMillis();
int b = 0;
for(int i = 0;i<50000;i++) {
b += (256 << 6) + (256 << 5) + (256 << 2);
}
System.out.println(b);
double end = System.currentTimeMillis();
System.out.println("运行时间: " + (end - start));
}
public static void main(String[] args) {
// TODO Auto-generated method stub
test1();
test2();
}
}
我们可以得到如下的结果:
总结:
实际在我们程序进行计算时,如果只执行一次计算,乘法和位运算符运算时间都是毫秒级别的,两者相差不大,时间有一部分是消耗在输出语句等。在进行极多次计算时,java对程序计算进行了优化,两数相乘和位运算符的计算时间相差不大,但实际上相乘是需要很长时间的,也从结果可以看出,增加了循环次数,位运算符计算所需要的时间比乘法的时间短。