📜  从1到N的所有奇数的按位与(1)

📅  最后修改于: 2023-12-03 14:49:20.217000             🧑  作者: Mango

从1到N的所有奇数的按位与

在计算机科学中,"按位与"是指将两个二进制数的对应位取 AND 运算,即两个位都为 1 时结果为 1,否则为 0。

题目要求我们计算从 1 到 N 的所有奇数的按位与,下面是解决问题的思路和代码实现:

思路

考虑将从 1 到 N 的所有奇数按二进制位进行比较。我们可以发现,对于任意一个奇数 i,其最低位都是 1,其次低位都是 0,依此类推。因此,将所有奇数的二进制表示的最低位进行按位与之后,得到的结果肯定是 1。接着,我们考虑计算次低位,此时是将所有奇数的二进制表示的最低位和次低位进行按位与,以此类推。只要存在一个奇数二进制表示的某一位为 0,那么该位的按位与结果就为 0。因此,我们可以得到从 1 到 N 的所有奇数的按位与结果。

代码实现
def bitwiseAnd(n: int) -> int:
    res = 0
    k = 1  # 代表当前正在计算哪一位
    while n >= k:
        # 每次比较最低位、次低位、第三低位......
        res |= (n >> 1) & 1 << (k - 1) if n & 1 else 0
        k += 1
        n >>= 1
    return res
测试用例

下面我们来验证一下代码的正确性。

assert bitwiseAnd(1) == 1
assert bitwiseAnd(3) == 1
assert bitwiseAnd(5) == 1
assert bitwiseAnd(7) == 3
assert bitwiseAnd(9) == 1
assert bitwiseAnd(15) == 7
assert bitwiseAnd(16) == 0