【发布时间】:2013-07-20 16:57:44
【问题描述】:
我正在研究《Programming Pearls》一书中的一个问题,他们推荐使用此函数在位向量中设置位。我对它的作用有点困惑。
#define BITSPERWORD 32
#define MASK 0x1F
#define SHIFT 5
#define N 1000000
int a[1 + N/BITSPERWORD];
void set(int i){
a[i >> SHIFT] |= (1 << (i & MASK));
}
这是我对这段代码的(可能是错误的)解释。 如果 i = 64,
1) 首先,它采用i 并将其向右移动 SHIFT(即 5)位。这相当于将i 与2^5 相除(而不是相乘)。所以如果i是64,那么a的索引就是2(64 / 2^5)
2) a[2] |= (1 << (64 & MASK))64 & 1 = 1000000 & 01 = 1000001.
所以 1 左移了多少位????
【问题讨论】:
-
右移是除以二。
-
This is equivalent to multiplying i by 2^5.NO 这相当于将i除以2^5。 -
你确定
i是int不是unsigned int? 你从哪里得到这个代码? -
糟糕。好的,所以我将其更改为反映除以 2^5。剩下的呢?
-
2 (64 / 2^5)?或者只有(64 / 2^5)...想想,如果1000 >> 1==0100所以x >> 5==x / 2^5只有
标签: c++ c bit-manipulation bitwise-operators