<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1、二进制与位运算</span>
要谈二进制,不得不谈一下位运算。关于二进制的操作都是基于位运算的。位运算的显著特点就是效率高
基本操作:<< >> ^ & | ~ !
位运算常用基础:
判断奇偶性:
<span style="font-size:12px;">x&1==0 //为偶数</span>
<span style="font-size:12px;">
</span>
求平均值:求(x+y)/2时,可能x+y会超过int的最大值,可以用位运算来求:
<span style="font-weight: normal;">int Ave(int x,int y) {
return x&y+((x^y)>>1);
} </span>
<span style="font-weight: normal;">int Ave(int x,int y) {
return x&y+((x^y)>>1);
} </span>
<span style="font-size:12px;">x&&!(<span style="color:#ff0000;">x&(x-1)</span>)//表达式为真表示x是2^n,x去除0这种特殊情况</span>
正整数的运算
x>>n;//x除以2的n次幂
取模运算
<span style="font-size:12px;">x&(2^k-1);///x对2^k取模</span>
交换两个数
<span style="font-size:12px;">a^=b;
b^=a;
a^=b;</span>
计算绝对值
int abs(int x){
int y;
y=x>>31;
return (x^y)-y;
}
快速幂运算
<span style="font-size:12px;">int pows(int a,int b){
int ans=1,tmp=a;
while(b!=0){
if(b&1)
ans*=tmp;
tmp*=tmp;
b>>1;
}
return ans;
}
</span>
蒙哥利马幂模运算
<span style="font-size:12px;">//前提:
(a*b) % c = (a%c) * b % c; //(公式1)
(a*b) % c = (a%c) * b % c = (b%c) * (a%c) % c = (a%c) * (b%c) % c; ///【公式二】</span>
核心基于快速密运算
<span style="font-size:12px;">int expMod2(int a,int b,int mod){
int tx=a;
int ans=1;
tx%=mod;
while(b!=0){
if(b&1)
ans=ans*tx%mod;
b=(b>>1);
tx=tx*tx%k;
}
return ans;
}</span>