位运算心得

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);
}
原文地址:https://www.cnblogs.com/davygeek/p/4342834.html