位运算和快速幂(和)的应用
- & 与运算(按位与)
- 在二进制中只有同一位置均为1时结果位才为1,否则为0!
- 如:9 & 5
- 00001001 (9的二进制)
- 00000101 (5的二进制)
- ————————————
- 00000001 (1的二进制)
- 所以 9 & 5 = 1
- | 或运算 (按位或)
- 在二进制中同一位有一个位为1,或同时为1时(只要不同时为0)结果位为1,否则为0!
- 如:9 | 5
- 00001001 (9的二进制)
- 00000101 (5的二进制)
- ————————————
- 00001101 (13的二进制)
- 所以 9 | 5 = 1
- ^ 异或运算 (按位异或)
- 在二进制中同一位同时不相同时,结果位为1,否则为0!
- 如:9 ^ 5
- 00001001 (9的二进制)
- 00000101 (5的二进制)
- ————————————
- 00001100 (12的二进制)
- 所以 9 ^ 5 = 12
- ~ 取反运算(按位取反)
- 在二进制中,结果位取该位置的反位(1取0,0取1)
- 如 9
- 000……01001 (32位)
- ————————————
- 111……10110 (32位)
- <<(左移)、>>(右移)移位运算
- 在二进制运算中,左移一位相当于*2运算,右移移位相当于/2运算。
- 左移
- 如 1(二进制0001)
- 1 << 1 (0010) = 2
- 1 << 2 (0100) =4
- 1 << 3 (1000) =8
- 右移
- 如 8(二进制1000)
- 8 >> 1 (0100) =4
- 8 >> 2 (0010) =2
- 8 >> 3 (0001) =1
介绍完二进制中的基本位运算后,我们开始讲解快速幂的算法:
快速幂是基于二进制的运算的一种快速算法
如 3^7= 2187
7的二进制为(0111)
3^1 =3 ^(2 ^ 0) = 3
3^2 =3 ^(2 ^ 1) = 9
3^4 =3 ^(2 ^ 2) = 81
3 ^13 ^23 ^4=2187
因为任意数都可以由2的次方组合出,因此得出当次方数的二进制在该位为1时,就乘上底数的(2在当前位置的次方)次方
long long pow(int Base,int M){
long long ans=1;//所求的答案
while(M){
if(M&1)ans=ans*Base;
Base*=Base;
M>>=1;
}
return ans;
}`
M为次方数
当Base为M当前二进制位置n底数的2^n的次方数
该算法的复杂度为log(n)