【Java】运算符 - 乘法除法问题

Posted by 西维蜀黍 on 2019-08-14, Last Modified on 2021-09-21

移位实现特殊乘除法运算

当一个数乘以或者除以 2 的整数倍时,比如:

a = a * 4;
b = b / 4;

可以优化为:

a = a << 2;
b = b >> 2;

说明:

除以2 = 右移1位 乘以2 = 左移1位 除以4 = 右移2位 乘以4 = 左移2位 除以8 = 右移3位 乘以8 = 左移3位 … …


System.out.println(66 /64);  //1
System.out.println(66 >> 6); //1

使用位操作代替求余操作

由于我们知道位运算比较高效,在某些情况下,当b为2的n次方时,有如下替换公式:

a % b = a & (b-1)(b=2n) 即:a % 2n = a & (2n-1)

例如:14%8,取余数,相当于取出低位,而余数最大为7,14二进制为1110,8的二进制1000,8-1 = 7的二进制为0111,由于现在低位全为1,让其跟14做&运算,正好取出的是其低位上的余数。

1110&0111=110即6=14%8;

此公式只适用b=2n,是因为可以保证b始终只有最高位为1,其他二进制位全部为0,减去1,之后,可以把高位1消除,其他位都为1,而与1做&运算,会保留原来的数。