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