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

猜你喜欢

转载自blog.csdn.net/Colorful_lights/article/details/81588647
今日推荐