int a; a*1.0 a*1ll
1<<n = 2^n n<<1 = n*2
1>>n = 1 / (2^n) n>>1 =n/2
判断一个数是不是偶数 n%2 == 0 n&1 == 1
判断一个数是不是偶数其实就是看其对应的二进数的最后一位是不是1 , 是1 就是奇数,是0就是偶数
if(a&1) cout<<odd;
else cout<<even;
n除2 n/2 n>>=1 >> 与 = 中间不能有空格
注意:区别: 3/2 = 1 3>>2 = 1 -3 / 2 = -1 -3 >> 2 =-2 (自动向下取整)
判断n的二进制形式的第j(从0开始)位是不是1 n>>j & 1
消除二进制形式下第j位的1 n - 1<<j
-n = ~n +1
用处:十进制转二进制,非常方便.快速幂,64位整数的加法,哈密顿图(从0点走到n-1最后一个点最短路径且所有的点都走过)。
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(){
int a= 10;
string str="";
while(a){
if(a&1) str=str+"1";
else str=str+"0";
a>>=1;
}
reverse(str.begin(),str.end());
cout<<str<<endl;
return 0;
}
图反向边
成对变换 位运算 ^
0 1 , 2 3 , 4 5 , 6 7 .
0^1 = 1 1^1=0
2^1 = 3 3^1=2
a[index] a[index^1]
树状数组基础
lowbit(n)运算
lowbit(1000001011100)=100
lowbit(13)=lowbit(1101)=1
int lowbit(int n){
return n & (-n);
}