【问题标题】:Palindrome Permutation (Cracking the Coding Interview 1.4)回文排列(破解编码面试 1.4)
【发布时间】:2016-11-30 06:45:53
【问题描述】:

我无法理解这两个函数中的位逻辑。

  1. 我不知道我们为什么要检查条件(bitVector & mask)== 0。

  2. 另外,为什么我们在满足条件时将 bitVector 与 mask 进行 OR,否则将 bitVector 与 ~mask 进行 AND?

  3. 为什么有一个属性可以“通过从整数中减去一位并将其与原始整数进行与运算来检查是否设置了一个位”?

完整代码here.

/* Toggle the ith bit in the integer. */
public static int toggle(int bitVector, int index) {
    if (index < 0) return bitVector;

    int mask = 1 << index;
    if ((bitVector & mask) == 0) {
        bitVector |= mask;
    } else {
        bitVector &= ~mask;
    }
    return bitVector;
}

/* Check that exactly one bit is set by subtracting one from the 
 * integer and ANDing it with the original integer. */
public static boolean checkExactlyOneBitSet(int bitVector) {
    return (bitVector & (bitVector - 1)) == 0;
}

【问题讨论】:

  • 对于 1 和 2,最好拿一张纸和一支笔写下一些内容。您将看到它的效果如何,它将帮助您正确理解它。
  • 你应该从阅读this开始
  • 对于toggle 函数,return bitVector ^ (~bitVector ^ mask); 会完成这项工作吗?

标签: java bit-manipulation permutation palindrome bitvector


【解决方案1】:

首先,重要的是要了解mask 只设置了一个位,所有其他位都为零。如果 index 为 0,则 mask 为 1。如果 index 为 1,则 mask 为 2。如果 index 为 2,则 mask 为 4。如果 index 为 3,则 mask 为 8。如果 index 为 4,则 mask 为 16。依此类推。所有这些掩码值都只设置了一个位,即第索引位。

我不知道我们为什么要检查条件 (bitVector & mask) == 0。

如果未设置该位,则此条件为真。如果该位被设置,bitVector &amp; mask 的结果将等于mask,我们知道它不为零。

另外,为什么我们在满足条件时将位向量与掩码进行或运算,否则将位向量与 ~mask 进行逻辑运算?

我们或设置位的值。我们与~mask 取消设置该位。请记住,掩码只设置了一位,因此~mask 设置了除一位之外的所有内容。

为什么有一个属性可以“通过从整数中减去一位并将其与原始整数进行与运算来检查是否设置了一个位”?

当你从一个数字中减去 1 时,最后一个 1 之后的所有位都变为 1。发生这种情况的原因与当一个以 10 为底的数字以一个或多个零结尾时,如果你减去 1,那么所有尾随零变成 9。我建议把一堆数字减为二进制,减去 1 后的值。简单的数学变得显而易见。

我们来看一个例子,16:

16 : 10000
15 : 01111

很明显,两个数字的与运算将得到 0。让我们看另一个例子,48:

48 : 110000
47 : 101111

很明显,将某个数字 num 与 num-1 进行与运算基本上会将最后一个 1 到末尾的所有位清零。如果之前有任何其他位,它们将保留,结果不会为零。仅当只有一个 1 时,结果才会为零。

【讨论】:

  • 再次感谢您的详细解释。我经常遇到位操作问题,所以有一些具体的分步示例可以参考。
猜你喜欢
  • 1970-01-01
  • 2018-11-21
  • 2013-09-05
  • 2015-12-06
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多