zoukankan      html  css  js  c++  java
  • 二进制中的技巧

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

  • 相关阅读:
    HDU 2047 阿牛的EOF牛肉串
    HDU 2015 偶数求和
    HDU 2029 算菜价
    HDU 2028 Lowest Common Multiple Plus
    动态函数库设计
    静态函数库设计
    Linux编程规范
    Linux应用程序地址布局
    Core Dump 程序故障分析
    W-D-S-UART编程
  • 原文地址:https://www.cnblogs.com/children/p/2369031.html
Copyright © 2011-2022 走看看