C的位運算和移位運算子
阿新 • • 發佈:2019-01-07
4個運算子:與(&)、或(|)、非(~)、異或(^)。
用法一:掩碼(把特定位設定為0)
flag &= MASK;
可以用來取餘(%),例如:a = b & 0xf; 等價於:a = b % 16;
用法二:置位(把特定位置為1,其他位不變)
flag |= MASK
用法三:清零(把特定位清零,其他位不變)
flag &= ~ MASK;
用法四:轉置位(把特定位取反,其他位不變)
flag ^= MASK;
用法五:檢視某一bit位的值
if ((flag & MASK) == MASK);
注意:位運算子的優先順序低於關係運算符(>、<、==),所以要加括號。
移位運算子:左移(<<)、右移(>>)
用法:可以高效的對2的次冪的乘和除
number << n 表示:number乘以2的次冪
number >> n 表示:如果number非負,number除以2的次冪
做個練習,是《程式設計珠璣》裡的一個例子(習題1.2):有個資料庫,存放著n(n<N)個整數,每個數都小於N,請把這些數字進行排序。
書中提供了一個高效的演算法,用1個bit位表示1個整數,不大於N的整數,只要N位既可以表示了。如果數字存在,就把相應位置1(例如,資料庫中有3,就把第3bit位置位1),然後根據bit位按順序重新輸出。
寫對bit位置位、清零、讀取的函式
#define BITSPERWORD 32 #define SHIFT 5 //2^SHIFT = BITSPERWORD #define MASK 0x1F #define N 100000 int g_bitmap[1 + N / BITSPERWORD]; void set_bit(int number) { g_bitmap[number >> SHIFT] |= 1 << (number & MASK); } void clear_bit(int number) { g_bitmap[number >> SHIFT] &= ~(1 << (number & MASK)); } int read_bit(int number) { return g_bitmap[number >> SHIFT] & (1 << (number & MASK)); }