zoukankan      html  css  js  c++  java
  • 位运算心得

    1.位运算

    今天复习位运算的时候发现一个规律,之前都没有注意的,就是二进制和2的关系

    2^0 = 0000

    2^1 = 0010

    2^2 = 0100

    2^3 = 1000

    后面的一次类推,可以很容易识别一个二进制的数和2的关系

    二进制之间的运算也都可以换算成和2相关的运算,和2相关的乘法和除法直接可以转化成移位运算来解决

    例如:

    0010 + 0010 =》 0010 * 2 =》 0010 左移1位 =》 0100 = 》 2*2 = 4

    0101 * 0100 = 》 0101 * 4 =》 0101 * 2^2 = 》 0101 左移2位 =》 10100 =》 2^4 + 2^2 = 16 + 4 = 20

    2.异或

    一个比特与对它取反的值做异或操作结果总是1,因此,a^(~a)结果是一串1

    3.常见位操作:获取、设置、清楚及更新位数据

      获取

      该方法将1左移i位,得到形如00010000的值,接着,对这个值与num执行 "位与" 操作,从而将i位之外的所有位清零。最后,检查该结果是否为零。不为零说明i位为1,否则,i位为0.

    boolean GetBit(int num, int i)
    {
        return ((num & ( 1 << i)) != 0 );
    }

     置位

     setBit先将1左移i位,得到形如00010000的值。接着,对这个值和num执行 “位或“ 操作,这样只会改变i位的数据。该掩码i位除外的位均为零,故而不会影响num的其余位。

    int SetBit(int num, int i)
    {
        return num | (1 << i);
    }

     清零

     该方法与setBit刚好相反。首先,将1左移i位去的形如00010000的值,对这个值取反进而得到类似11101111的掩码。接着,对该掩码和num执行 ”位与“ 操作。这样只会清零num的i位,其余位保持不变。

    int ClearBit(int num, int i)
    {
       int mask = ~( 1 << i);
       return num & mask;  
    }

     更新

     这个方法将setBit与clearBit合二为一。首先,用诸如11101111的掩码将num的第i位清零。接着,将待写入值v左移i位,得到一个i位位v但其余位都是0的数。最后,对之前取得的两个结果执行 ”位或“ 操作, v位1则将num的i位更新位1,否则该位任为0.

    int updateBit(int num, int i, int v)
    {
      int mask = ~(1 << i);
      return (num & mask) | (v << i);
    }
  • 相关阅读:
    蚂蚁和木杆问题
    计算二进制中1的个数(转)
    strlen源码剖析(转)
    bashrc
    smb.conf配置文件(Centos)
    配置VNC+PuTTY+SSH Tunnel访问Linux
    标题: BASH最常见的激活模式
    KMP算法
    字符串中单词逆序
    Java中堆内存和栈内存详解
  • 原文地址:https://www.cnblogs.com/davygeek/p/4342834.html
Copyright © 2011-2022 走看看