程序設計語言中有各種各樣的運算符,除了四則運算的加減乘除外,還有各式各樣的位運算符(|,~,&,^)。說實話,我也沒記清這些運算符的優先級,當然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://m.shnenglu.com/EyeOfProvidence/archive/2010/01/05/104868.html