您的位置:首页 > 其它

C 位操作

2012-08-23 11:45 176 查看
由于C基础不牢,对位的操作一直不能很好的理解,今天早上想了1个小时才相同,写个博客加深一下理解。

题目:现在有10,000,000个整数,里面有重复的数字,需要找出来。

理解:10,000,000个整数需要对应的10,000,000bit,一个整数是32bit,所以需要的数组a[]的个数为10,000,000/32+1。

现在有一个整数1000,首先通过1000/32得出对应的bit在第31个整数中的第8位。为了把这位设为1,用a[31]|=(1<<8)就可以了,清除这位用a[31]&=~(1<<8),检查该位用a[31]&(1<<8)

“i/32”用"i>>5"表示,得到上述8的方法是用“i&0*1F”,也就是求“i”的模。

代码如下:

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0*1F
#define N 10000000
int a[1+N/BITSPERWORD]

void set(int i){  a[i>>SHIFT]|=(i<<(i&MASK));}
void clr(int i){  a[i>>SHIFT]&=~(i<<(i&MASK));}
void set(int i){  a[i>>SHIFT]&(i<<(i&MASK));}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: