我正在解决问题MAXCOUNT的最佳解决方案,并找到了一些我不理解的行。
Codechef Problem和 Best 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))
我不知道使用这些线路有什么意义 任何人都可以解释这些线,为什么使用它们?
答案 0 :(得分:3)
它看起来像是指存储为整数的位数组。 n&gt;&gt; 5意味着将它除以32,并且在int中有32位,以便为数组编制索引。然后右边使用余数(31的位模式是0b11111
意味着和它的操作将过滤掉所有其余的位,只剩下五个最不重要的位 - 这恰好匹配在除以32之后的余数,以找到它感兴趣的特定位(1 <&n; n在位置n处产生一位掩码,并且&amp;运算符滤除除此之外的所有位)。
Unset使用〜,反转掩码 - 清除该位,其余部分保持不变。 set
使用按位或运算符,它设置一个位。
因此它们只是用于处理整数数组中各个位的便捷宏。