【问题标题】:Filpping bits in binary number翻转二进制数中的位
【发布时间】:2015-11-04 05:36:28
【问题描述】:

任何人都可以为以下问题提供清晰的逻辑。我陷入了困惑。

一个 n 位数作为输入,OP(j) 和 OP(k) 一个接一个地应用在它上面。目标是指定应用这两个操作后有多少位保持不变。

OP(i) 意味着 每个 ith 位的翻转。我 > 0

【问题讨论】:

  • 听起来很像,根据定义,n - 2 位保持不变,除非 j == k,在这种情况下没有位改变。我是不是误会了什么?
  • 我实际上对 OP(i) 的定义感到困惑。抱歉,我编辑了相同的内容。它表示每个 ith 位的翻转。
  • 嗯,这让这个问题更有意义,至少。 :) 是什么让你感到困惑呢?还有,为什么这个问题被标记为“c”?
  • 如果一个位被翻转两次,与原来相比,它算作改变位吗?
  • 翻转每个 ith 位是什么意思。根据我的理解,如果我指示一个位置,那么只有那个位会被翻转..但是每个? ..请帮忙

标签: bit-manipulation bitwise-operators


【解决方案1】:

根据您的描述,操作 OP(i) 将更改每个第 i 位,因此它总共更改 floor(n / i) 位。链接操作使事情变得棘手。如果相同的参数传入两次,那么相同的值会被翻转,翻转的总位数为0,因为我们恢复到原来的值。

如果第二次运算使用了不同的值(j),那么你需要加上 floor(n / j) 然后减去 2*M,其中 M 是 i 和 j 在 n 范围内的公倍数的个数。这是因为您将翻转任何公倍数两次并将它们恢复为原始值,但是将它们累积两次(一次在 OP(i) 中,一次在 OP(j) 中),您需要从总数中减去 2来解释它。

【讨论】:

    【解决方案2】:

    对于 k != j,n-2 位保持不变。 当 k == j 时,n-1 位保持不变。

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2011-08-25
      相关资源
      最近更新 更多