位运算符用来对二进制位进行操作,Java中几个基本的位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
**
运算方法:
按位与运算符"&": 其功能是参与运算的两数各对应的二进位相与,即只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
按位或运算符“|”: 其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
按位异或运算符“^”: 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现。
求反运算符~: 其功能是对参与运算的数的各二进位按位求反。
左移运算符“<<”:左移n位就是乘以2的n次方。 其功能把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
右移运算符“>>”:右移n位就是除以2的n次方,其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数,低位丢弃,高位补与符号位相同的数。
乘法优化:
大家都知道,计算机只能进行加减运算,其他运算实际都是转换成加减运算。乘法实际是加法运算。当乘数很大时,执行大量加法运算,运算速度会受影响。例如一亿乘一亿,就是一亿个一亿相加。
在java中利用左移右移运算,对乘除进行了优化。可以把大的乘数换算成多个2的n次方值之和(就像十进制转二进制),
如:88 * 123
其中 123=64+32+16+8+2+1 ,
那么 88 * 123=88 * 64+88 * 32+88 * 16+88 * 8+88 * 2+88 * 1
从上面的位运算介绍可以知道,左移n位就是乘以2的n次方。所以像 88 * 64 就可以转换成对88 左移 6 位(移位对二进制存储的计算机来说是再简单不过的了),而不是64个88相加,这样就快速的多了。其余值同理。