1.位运算
原码:0000...01010 反码(就是原码取反)1111...10101 补码(~x+1) 1111...10110
与 &(AND):0&0=0,0&1=0,1&0=0,1&1=1 ;左右两边有一边是0,它就是0;
或 |(OR):0|0=0 ,1|0=1,1|1=1,0|1=1 ;左右两边有一边是1,它就是1;
取反 ~(NOT):~0=1,~1=0;
异或 ^(xor):0^0=0,0^1=1,1^0=1,1^1=0;两个一样就是0,不一样就是1
左移 <<:a=110 a<<1;//a=1100; a<<k 等价于 a 乘以2的k次方
右移 >>: a=110110 a>>1;//数向右移一位变成11011 a>>k 等价于 a除于2的k次方
求x的第k位数字:x>>k&1;
lowbit(x)=x&-x (x&(~x+1))返回x的最后一位1 ,比如1110010010->10
2.库函数 头文件 < algorithm >
1.reserve 翻转
int a[5]={1,2,3,4,5} reserve(a,a+5)->5,4,3,2,1//第一个写的是数组第一个指针,第二个写的是数组最后一个位置的下一个位置
2.unique 去重
int a[]={1,1,2,2,3,3,4} int m=uqiue(a,a+7)-a;//第一个写的是数组的开始,第二个写的是数组的结尾
vector<int>a{(1,1,2,2,3,3,4)};int m=uqiue(a.begin(),a.end())-a.begin();或者 a.erase(unique(a.begin(),a.end()),a.end());//先把开头和结尾之间的元素去重,放到数组最开头的位置,再把后面多余的部分删掉;
3.random_shuffle() 随机打乱
vector<int>a({1,2,3,4,5}); random_shuffle(a.begin(),a.end());//参数与reserve一样
4.sort 快速排序
sort(a.begin(),a.end());//参数与reserve一样,从小到大排序;
sort(a.begin(),a.end(),greater<int>())//从大到小排序
还可以自己构造:在头文件下面写个函数
bool cmp(int a,intb){//a是否排在b的前面
return a<b;//如果a<b,a就要排在b的前面,从小到大的顺序
return a>b;//如果a>b,a就要排在b的前面,从大到小的顺序
}
sort(a.begin(),a.end(),cmp);
排结构体
5.lower bound/upper bound 二分
int a[]={1,2,3,4,5}; int *p=lower_bound(a,a+5,3);找到第一个大于等于3的值
int t=lower_bound(a,a+5,3)-a;返回数组下标
int *p=upper_bound(a,a+5,3)//找到第一个大于3的值