昨天主要学习了一些基本算法,有位运算,递推与递归。
位运算能够帮助我们理解程序运行中的种种表现,提高程序运行的时空效率,降低编程复杂度。
基本的运算符有:与:and/&;或:or/|;非:not/~;异或:xor/^;
整数型包括无符号整型int和有符号整型unsigned int。有符号整型的最高位是0的话是整数,1的话是负数。
移位运算:1<<n=2^n,n<<1=2*n;在二进制补码表示下把数字同时向右移动,高位以符号位填充,低位越界后舍弃。算术右移是向下取整,整数/2是向零取整。
快速幂:求a的b次方对p取模的值
由数学常识b=ck-1*2^(k-1)+ck-2*2^(k-2)+......+c0*2^0;
于是有:a^b=a^(ck-1*2^(k-1))*a(ck-2*2^(k-2))*......*a^(c0*2^0);b&1运算可以取出b在二进制表示下的最低位,而b>>1运算可以舍去最低位,在递推的过程中将二者结合即可求解,时间复杂度为O(log2N);
代码实现:
int power(int a,int b,int p)
{
int ans=1%p;
for(;b;b>>=1)
{
if(b&1)ans=(long long )ans*a%p;
a=(long long )a*a%p;
}return ans;
}
64位整数乘法也可类似于快速幂的思想 代码:
long long mul(long long a ,long long b,long long p)
{long long ans=0;
for(;b;b>>=1){
if(b&1)ans=(ans+a)%p;
a=a*2%p;
}return ans;
}
二进制状态压缩:将一个bool数组用一个m位二进制表示并储存的方法;
一些基本操作:
取出n的第k位:(n>>k)&1
取出0~k-1位:n&((1<<k)-1)
第k位取反:nxor(1<<k)
k位赋值1:n|(1<<k)
k位赋值0:n&(1<<k))
lowbit运算:lowbit(n)=n&(-n);
位运算的一些知识,大致这些,递推和递归还在学习中...