Palindrome排列(破解编码访谈1.4)

时间:2016-11-30 06:45:54

标签: java bit-manipulation permutation palindrome bitvector

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

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

  2. 另外,为什么我们在满足条件时将bitVector与掩码进行OR运算,否则将bitVector与〜掩码进行对比?

  3. 为什么有一个属性可以通过从整数中减去一个并用原始整数“和”来检查确切地设置了一个位?#/ p>

  4. 完整代码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 个答案:

答案 0 :(得分:5)

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

  

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

如果未设置该位,则该条件为真。如果该位已设置,bitVector & mask的结果将等于mask,我们知道这不是零。

  

另外,为什么我们在满足条件时将bitVector与掩码进行OR运算,否则将bitVector与〜掩码进行对比?

我们或者设置该位的值。我们和~mask取消了这一点。请记住,掩码只有一位设置,因此~mask除了一位设置外都有。{/ p>

  

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

当你从一个数字中减去1时,最后一个1之后的所有位都变为1.这种情况发生的原因与基数为10的数字以一个或多个零结束时相同,如果你减1,那么所有的尾随零我建议用二进制数来减去一堆数字,减去它后的数值。简单的数学变得明显。

让我们看一个例子,16:

16 : 10000
15 : 01111

很明显,对这两个数字进行AND运算将得到0.让我们看另一个例子,48:

48 : 110000
47 : 101111

很明显,使用num-1对某些数字进行AND运算基本上将从最后1位到结束的所有位都清零。如果之前有任何其他位,它们将保留,结果不会为零。如果只有一个,结果将只为零。