1. 除以2运算相当于>>1运算
2.交换二进制数中相连的1和0的方法:
如a=XXX10XX,要交换第四位的1和第三位的0,则令a=a-100;
如a=XXX01XX,要交换第四位的0和第三位的1,则令a=a+100;
3.二进制数a减1,相当于将a末尾的0置为1,将最低位的1置为0:
如a=XXX1000,a-1=XXX0111
利用这个特性,可以用如下方法求出a有多少个1,复杂度为O(V),V为a包含1的个数:
int num=0;
while(a){
a=a&(a-1);
num++;
}
return num;
4.十进制数N的二进制数末尾有多少个0,取决于这个N有多少个质因子2:
如20=4×5=2×2×5,所以20的二进制数10100末尾有2个0
这是因为10100做两次<<1运算后,遇到最低位1,每做一次<<1运算相当于除以2。
所以要求N的最低位1位于第几位时,可以令n=N-[N&(N-1)],看n有多少个0,即:
int n=N-[N&(N-1)],
int num=0;
while(n){
n<<1;num++;
}
5.如果要求一个数A模B的结果,而B=2^n,则求解可以用A&(B-1)代替