2019-07-22训练日志

  昨天主要学习了一些基本算法,有位运算,递推与递归。

位运算能够帮助我们理解程序运行中的种种表现,提高程序运行的时空效率,降低编程复杂度。

基本的运算符有:与: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);

位运算的一些知识,大致这些,递推和递归还在学习中...

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值