基本算法-位运算
与 | & |
或 | 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; }
二进制状态压缩
将一个长度为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) ) |
无愧于心,不困于情。