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