【问题标题】:Finding all numbers which are less than a given no with less no of set bits than the given no but in the same position查找所有小于给定 no 且设置位数少于给定 no 但位于相同位置的数字
【发布时间】:2020-05-03 13:17:51
【问题描述】:

如何找到所有小于给定 no 且设置位数少于给定 no 的数字,但不管 no。设置位的每个生成的 no 都将与给定 no 的设置位位置相同。举一个例子假设给定的 no 是 13(二进制的 1101),那么所有生成的 no 将是 12(二进制的 1100 ),9 (二进制 1001),8(二进制 1000),5(二进制 0101),4(二进制 0100),1(二进制 0001)。 可以看出,在 1100 中(设置的位位置是 2 和 3,如给定的 no.1101)。 我想要一个有效的算法。

【问题讨论】:

  • 为什么不是十个? 1010?
  • 因为在 1010 中设置的位位置是 1 和 3,但在 13(二进制中的 1101)中,1 位置没有设置位
  • 我希望生成的 no 的 set bit 位置根据给定 no 无论它有多少 set bits
  • 所以你只想要由原始数字所在位置的数字组成的数字上的所有子集?你知道这个数字很大吗?是类似于 2^n 的东西,其中 n 是原始位中设置为 1 的位数?
  • 是否必须生成给定编号的设置位位置的所有子序列?

标签: algorithm c++11 bit-manipulation


【解决方案1】:
std::vector<int> subset(int x) {
    std::vector<int> res;
    for(int i = 1; i < x; ++i)
        if (i == (i&x))
            res.push_back(i);
    return res
}

它的复杂性在最坏的情况下是最佳的(如果x = 2^k-1)。

【讨论】:

    【解决方案2】:

    这似乎等同于枚举由集合位定义的集合的子集。在这里回答:https://stackoverflow.com/a/29043170/378360

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      相关资源
      最近更新 更多