常规求幂
- int pow1(int a,int b)
- {
- int r=1;
- while(b--)
- r*=a;
- return r;
- }
二分求幂(一般)
- int pow2(int a,int b)
- {
- int r=1,base=a;
- while(b!=0)
- {
- if(b%2) //二进制
- r*=base;
- base*=base; //未保存的“打表”
- b/=2;
- }
- return r;
- }
二分求幂(位操作,同pow2)
- int pow4(int a,int b)
- {
- int r=1,base=a;
- while(b!=0)
- {
- if(b&1)
- r*=base;
- base*=base;
- b>>=1;
- }
- return r;
- }
快速求幂(位运算,更复杂)
- int pow3(int x,int n)
- {
- if(n==0) return 1;
- else
- {
- while((n&1)==0)
- {
- n>>=1;
- x*=x;
- }
- }
- int result=x;
- n>>=1;
- while(n!=0)
- {
- x*=x;
- if((n&1)!=0)
- result*=x;
- n>>=1;
- }
- return result;
- }
与运算:&
两者都为1为1,否则为0
1&1=1, 1&0=0, 0&1=0, 0&0=0
或运算:|
两者都为0为0,否则为1
1|1 = 1, 1|0 = 1, 0|1 = 1, 0|0 = 0
非运算:~
1取0,0取1
~1 = 0, ~0 = 1
~(10001) = 01110
异或运算
两者相等为0,不等为1
1^1=0, 1^0=1, 0^1=1, 0^0=0
移位运算 右移一位相当于除2,右移n位相当于除以2的n次方。
45>>2 //45右移两位
45的二进制为:101101
右移两位就为: 001011
001011再转化为十进制为:11