1. 程式人生 > >C的位運算和移位運算子

C的位運算和移位運算子

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));
}