本文共 1511 字,大约阅读时间需要 5 分钟。
先来谈谈位运算背景:
在现代计算机中所有的数据都是以二进制的形式存储在设备中。即0、1两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。位运算就是直接对整数在内存中的二进制位进行。
我们来一一介绍下有哪几种位运算符:(上面是A,下面是B,拿 8 位举例)
比较两个数,然后返回一个新的数,这个数的每一位设置1的条件是两个输入数的同一位都不为0(即任意一个为1,或都为1),如下图:
A:1011 0010 B:0101 1110 (A | B) 结果为 254 , 二进制为 1111 1110以上就是位运算的运算符。
下面我们来聊一下,
我们都知道位运算是公认的高效运算,Java对于数值非常大的数做乘法依然处理的很快,这是因为做了位运算优化。
我们先来举个例子:
对十进制数:90,做位运算 90 << 3,结果应该是多少?
答案肯定是:90000,即 90 * 10^3.
那么对于二进制数也是如此,
int a = 90;a = a << 3;System.out.println(a);
运行结果:
720
90在计算机中以二进制形式存储,左移 3 位,就相当于 90 * 2^3 = 720.
那么回到Java乘法优化这里,
123 * 237
=123 * 128 + 123 * 64 + 123 * 32 + 123 * 8 + 123 * 4 + 123 * 1
=123 << 7 + 123 << 6 + 123 << 5 + 123 << 3 + 123 << 2 +123
这样算起来是不是就要快了许多。
对于乘法和以及%运算,JVM一定会优化,这些是不需要程序员去考虑的,直接去用 * 、% 即可。
参考链接:
转载地址:http://owprn.baihongyu.com/