程序设计语言中有各种各样的运算符,除了四则运算的加减乘除外,还有各式各样的位运算符(|,~,&,^)。说实话,我也没记清这些运算符的优先级,当然google一下还是可以查出来的。优先级从高到底是~&^|。在平常应用中,位运算有很强的作用。现在就我使用位运算很好用的东西来说说位运算是非常强大的。
运算符 |
作用 |
样例 |
结果 |
~ |
按位取反 |
~1001 |
0110 |
& |
两个1为1,否则为0 |
1101&0101 |
0101 |
^ |
相同为0,不同为1 |
1101^0101 |
1000 |
| |
两个0为0,否则为1 |
1101|0101 |
1101 |
1:简单应用
把某一位置0或置1。如果想把k的第m位置0,则可以这样做:k&=~(1<<m)。如果想把k的第m位置1,则可以这样做:k|=(1<<m)。
测试某一位为1或0。如测试k的第m位是否为1可以这样做:k&(1<<m) != 0。
2:枚举所有子集合。如果数据不大,可以让每一位对应一个集合,1就是子集中,0就没在子集中。
for(int i = 0; i < (1<<m); ++i) {
for(int k = 0; k < m; ++k) {
if(i&(1<<k)) {
//in subset
}
}
}
这个地方还有更好的办法(对于第二重循环)也是使用位运算,大家可以想一想。
3:表示一位特殊值。如~0表示2^32-1
4:不使用中间变量交换两上变量的值。利用异或的性质。如交换a,b的值,可以这样:a^=b, b^=a, a^=b。
5:只保留最后一个非0位。可以使用x&(~(x-1))即可。
6:求模2的除数。因为只判断二进制的最未位就行了,故可以用x&1来表示。
对于位运算还有很好很好的用法,由于本人水平有限,如果您有很好的使用位运算的方法,请留言分享。谢谢。
转自:http://www.cppblog.com/EyeOfProvidence/archive/2010/01/05/104868.html