【问题标题】:What is the significance of these #defines?这些#defines 的意义是什么?
【发布时间】:2014-12-21 18:42:01
【问题描述】:

我正在研究问题 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))

我不知道使用这些行有什么意义。
谁能解释一下这些行以及为什么要使用它们?

【问题讨论】:

  • 搜索“C 宏”
  • 顺便说一句:这些不是很好的宏。至少(1&lt;&lt;(n&amp;31)) 应确保无符号算术,例如:(1u&lt;&lt;(n&amp;31))。此外,常数 31 是基于n 范围的假设。

标签: c bit-shift


【解决方案1】:

看起来它指的是一个存储为整数的位数组。 n >> 5 表示将其除以 32,并且 int 中有 32 位,以便索引数组。然后右侧使用余数(31 的位模式是0b11111,这意味着与它的 and 操作将过滤掉所有其余位,只留下五个最低有效位 - 这恰好与之后的余数匹配除以 32)以找到它感兴趣的特定位(1

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

所以它们只是用于处理整数数组中各个位的便利宏。

【讨论】:

  • 不错的答案。也许您可以添加 31 的位模式是0b11111,因此n &amp; 31 返回n 的五个最低有效位。
  • 是的,确实,我会补充。作为一般规则,任何 2 的幂都是一位。二减一的幂是它右边的所有位。如果你除以 2 的幂,这恰好匹配余数(类似于十进制数字,如果你除以 10,余数将是右边的最后一个数字)。 & 和余数通常并不相同,但在这种情况下,使用作者在这里的位时会很好。
猜你喜欢
  • 2017-04-30
  • 2013-05-09
  • 2013-08-20
  • 2014-12-24
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
相关资源
最近更新 更多