这些#defines有什么意义?

时间:2014-12-21 18:42:01

标签: c bit-shift

我正在解决问题MAXCOUNT的最佳解决方案,并找到了一些我不理解的行。

Codechef ProblemBest Solution submitted

在我阅读代码以观察方法时,我在代码顶部遇到了这些行:

#define isSet(n) flags[n>>5]&(1<<(n&31))
#define unset(n) flags[n>>5] &= ~(1<<(n&31))
#define set(n) flags[n>>5]|=(1<<(n&31))

我不知道使用这些线路有什么意义 任何人都可以解释这些线,为什么使用它们?

1 个答案:

答案 0 :(得分:3)

它看起来像是指存储为整数的位数组。 n&gt;&gt; 5意味着将它除以32,并且在int中有32位,以便为数组编制索引。然后右边使用余数(31的位模式是0b11111意味着和它的操作将过滤掉所有其余的位,只剩下五个最不重要的位 - 这恰好匹配在除以32之后的余数,以找到它感兴趣的特定位(1 <&n; n在位置n处产生一位掩码,并且&amp;运算符滤除除此之外的所有位)。

Unset使用〜,反转掩码 - 清除该位,其余部分保持不变。 set使用按位或运算符,它设置一个位。

因此它们只是用于处理整数数组中各个位的便捷宏。