读书人

求教关于位演算的一道题目答案的解释

发布时间: 2013-08-09 15:16:24 作者: rapoo

求教关于位运算的一道题目答案的解释
题目:如何使用位逻辑运算(例如与,或,移位)来实现位向量set操作(令位向量数组第N位为1)?

答案:

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 100000
int a[1+N/BITSPERWORD]

void set(int i) {
a[i>>SHIFT] |= (1<<(i & MASK));
}



请教a[i>>SHIFT] |= (1<<(i & MASK));这个语句的注释
非常感谢!
[解决办法]

void set(int i) {
a[i>>SHIFT]
[解决办法]
= (1<<(i & MASK));
}


其实就是


void set(int i) {
a[i/32]
[解决办法]
= (1<<(i%32));
}


左移5位相当于除2^5也就是32,i & 0x1F 保留了低五位,相当于模32.
i是int类型,32位的,而a是int型数组,所以除以32可以知道是在a的数组中哪一个下标,模32可以确定某一位

读书人网 >C语言

热点推荐