基本算法-位运算

l
~
异或 xor

 同1为1

 有1为1

 异1同0

在m位二进制中,通常称最低位为第0位,从右到左类推,最高位为第m-1位

补码

对于32位无符号整数来说,直接把这个编码看做无符号二进制数;对于32位有符号整数来说,最高位是符号位,0表示非负数,1表示负数。对于非负数,直接看做32位二进制数S

初始化为无穷大,选用memset(a,0x3f,sizeof(a)),因为它的两倍不超过int的最大值,且可以用memset赋值(每8位都相同)

移位运算

左移:数字向左移动,低位以0填充,高位越位后舍弃。1<<n=2^n  n<<1=2n

右移:n>>1=[ n/2.0 ]向下取整

快速幂

long long ksm(long  long a,long long  b){
    long long ans=1;
    while(b){
        if(b&1==1)     ans*=a; //是因为3/2=1,有一个a^1要处理
        a*=a;
        b/=2;
    }
    return ans;
}
View Code

二进制状态压缩 

将一个长度为m的bool数组用一个m位二进制整数表示并存储的方法。

eg.整数n

操作 运算
取出n的第k位 (n>>k)&1
取出n的第0~k-1位 n&( (1<<k)-1 )
把n的第k位取反 n xor (1<<k)
把n的第k位赋值1 n l (1<<k)
把n的第k位赋值0 n&(~(1<<k) )
原文地址:https://www.cnblogs.com/SUMMER20020929/p/10496918.html