【问题标题】:Determining whether a number contains a given power of two in its sum确定一个数字的和中是否包含给定的 2 次方
【发布时间】:2017-09-05 22:45:01
【问题描述】:

标题措辞很糟糕,但我想不出如何总结问题。

基本上,每个数字都可以通过添加 2 的幂来形成,其中每个数字最多出现一次。例如20=16+4、27=16+8+2+1等

确定一个给定数字是否出现在另一个数字的分解中的最有效方法是什么?

简单地计算要添加的完整数字集并查看数字是否出现在其中并不难。但一定有某种捷径,对吧?当我只需要验证给定数字的存在时,计算整个集合似乎有点过头了。

【问题讨论】:

  • 你所说的“数字”到底是什么意思?这听起来像是一个奇怪的问题,但通常计算机上的数字已经存储为一堆 2 的幂的总和(这就是二进制)。
  • 我认为您正在寻找的是 AND 运算符。例如,在 Python 中,27 & 4 等于 0,但27 & 8 等于 8。此外,bin(27) 会显示与数字 27 的每一位对应的所有 1 和 0。
  • 这只是在不以二进制形式存储整数的计算机上真正存在的问题。但是,如果我们对基数 n 进行概括,那么是的,您的基本选择是开始将数字除以 n,直到达到所需的 n 进制数。

标签: algorithm performance math


【解决方案1】:

您在问如何检查是否设置了特定位。

问题“2**x 是否出现在 y 的分解中?”相当于问题“在 y 的二进制表示中是否设置了位 x?”。

所以你可以使用位运算符来检查 - 伪代码:

bit_is_set = (y & 2**x != 0)

【讨论】:

    【解决方案2】:
    • 获取数字的二进制表示。
    • 查看代表您要查找的 2 的幂的位是否已设置。

    例子:

    要查找 256 (= 1000000002) 是否由 4 (= 1002) 组成,请查看第 3rd 位设置或不设置 256 的二进制表示。在这种情况下,它没有设置。

    另外,看到 260 (= 100001002) 确实由 4 组成,因为它的第 3 位已设置。

    【讨论】:

      【解决方案3】:

      构成数字的 2 的幂列表:

      [2 ** (31 - i) for i, j in enumerate('{0:032b}'.format(x)) if j == '1']

      然后您可以使用in 进行成员资格测试。

      >>> x
      27
      >>> [2 ** (31 - i) for i, j in enumerate('{0:032b}'.format(x)) if j == '1']
      [16, 8, 2, 1]
      >>> 4 in [2 ** (31 - i) for i, j in enumerate('{0:032b}'.format(x)) if j == '1']
      False
      

      在哪里

      • '{0:032b}'.format(x) 将数字格式化为 32 位二进制字符串。

      • enumerate('{0:032b}'.format(x)) 用于为每个位分配索引。

      • 然后我们查找为 1 的位 (j == '1'),并提取 2 2 ** (31 - i) 的对应幂。

      【讨论】:

        猜你喜欢
        • 2017-07-02
        • 2016-12-03
        • 2020-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 2022-08-16
        • 2019-04-04
        相关资源
        最近更新 更多