引言:编程语言不只有直接对数值进行计算的运算符(+、-、*、/ 等等),还有精确到位的位运算符:左移<<和右移>>
(1)位运算符简介
位运算符用于对给定数值的每一位进行操作。
左移运算符<<对数值的每一位进行左移操作,因为计算机是二进制数值,所以左移一位的实质是对数值进行乘2。以此类推,左移两位是对数值进行乘4,左移三位进行乘4。
相应的,右移运算符>>对数值每一位进行右移操作,右移一位的实质是对数值除以2.右移两位除以4,右移三位除以8.
(2)计算机乘除的实质
学过计算机组成原理的话我们应该知道,计算机CPU的逻辑运算单元(ALU)只有加法,减法和乘法、除法都是加法的变换。当我们对数值乘一个较大的数时,实际上是ALU进行了许多次的加法运算。
(3)位运算对乘除法运算的优化
前边说到,位运算的实质是对数值进行乘除运算(数值为2的幂级)。所以当我们对数值使用乘法运算时,可以将其转换相同数值的位运算,比如:4
int a=4;
int b=4*150;
(ALU的实质是4加4加了150次)
加入使用位运算符达到相同效果:
int a=4;
int b=(a<<7)+(a<<4)+(a<<2)+(a<<1);
使用位运算符替换乘法运算的原因是使用位运算时,CPU只要对每一位左移即可达到乘法目的,大量节省ALU计算时间,尤其是乘数很大时。
注:目前新版本的JDK已经对乘法做了优化,优化手段就是将乘法转换为相应的位运算,大量节省计算时间。