二进制中的技巧

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)代替

原文地址:https://www.cnblogs.com/children/p/2369031.html