2 条题解

  • 1
    @ 2024-8-1 23:01:24

    介绍一个函数:

    __builtin_popcount(x)

    返回 xx 的二进制表示 11 的数量

    22 的整数次幂的二进制表示中只包含 1111

    比如 8=(100)2,16=(1000)28 = (100)_2,16 = (1000)_2

    • 1
      @ 2024-7-31 17:43:09

      考虑2的整数次幂的性质

      nn 的二进制表示只有一个 11

      那么怎么快速判断呢?

      考虑 n1n - 1 ,它的二进制表示是多少呢?

      肯定比 nn 小。

      比如:16=(1000)216=(1000)_2 那么 15=(0111)215=(0111)_2

      可以观察发现他们所有位都发生了交换,所以我们让他们进行与运算,最后答案就变成 00 了。

      即我们只需要判断 n&(n1)=0n \& (n-1)=0

      法2:lowbit

      lowbit:返回二进制表示的最后一个1

      所以我们直接判断 lowbit(n) 是否等于 n

      lowbit运算公式:n & -n

    • 1

    信息

    ID
    9
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    15
    已通过
    9
    上传者