翻转二进制数中的位

Filpping bits in binary number

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

一个n位数作为输入,OP(j)和OP(k)相继应用于它。 Objective是指定应用这两个操作后有多少位保持不变。

OP(i) 表示翻转 每个第 i 位。我 > 0

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

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

如果第二次运算使用不同的值(j),则需要加上floor(n / j)再减去2*M,其中M为n内i和j的公倍数的个数范围。这是因为您将翻转任何公倍数两次并将它们恢复为原始值,但是已经将它们累加了两次(一次在 OP(i) 中,一次在 OP(j) 中),您需要从总数中减去 2考虑到这一点。