📜  按位与为正的前 N 个自然数的最大数集(1)

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

按位与为正的前 N 个自然数的最大数集

当我们按位与两个数时,每个位必须都是1才会返回1,否则返回0。因此,如果我们按位与相邻的自然数,它们的二进制表示至少在某一位上有一个0和一个1,因此结果是0。如果我们按位与非相邻的自然数,它们的二进制表示通常在几个位置上都有1,因此结果可能不是0。因此,如果我们按位与前N个自然数,最大的数集将是所有比2的整数次幂小的自然数,即[1, 2, 4, 8, ..., 2^k]中最大的满足2^k≤N的k。

以下是一个Python程序,它接受N作为输入并返回按位与为正的前N个自然数的最大数集:

def max_and_set(N: int) -> List[int]:
    res = []
    while N > 0:
        k = 1
        while k <= N:
            k <<= 1
        k >>= 1
        res.append(k)
        N -= k
    return res

该程序使用两个内循环。外循环计算最大的2的整数幂,它不超过N。内循环将该幂添加到结果列表中,并将N减去该幂。当N为0时,程序退出循环并返回结果。

例如,当N为24时,程序返回[8,16]。这是因为24的二进制表示为11000,如果我们按位与1,2,4,8和16,将得到以下结果:

1:     00001
2:     00010
4:     00100
8:     01000
16:    10000

你可以看到只有8和16具有非零位,在第4位(从右数)上匹配。因此,该程序返回8和16。

在下面的markdown单元格中演示了如何使用该函数来打印按位与为正的前N个自然数的最大数集:

N = 24
res = max_and_set(N)
print("Max AND Set for N =", N)
print(res)

最后,这是打印的输出:

Max AND Set for N = 24
[8, 16]