如何查找所有小于给定编号且设置位数不小于给定编号的数字。每个生成的no的设置位的位置将与给定no的设置位位置相同。给出一个示例,假设给定的no为13(二进制为1101),那么所有生成的no均为12(二进制为1100) ),9(二进制为1001),8(二进制为1000),5(二进制为0101),4(二进制为0100),1(二进制为0001)。 可以看出,在1100中(如给定的编号1101那样,置位位置是2和3)。 我想要一个有效的算法。
答案 0 :(得分:0)
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
,它的复杂性是最佳的。
答案 1 :(得分:0)
这似乎等效于枚举由设置位定义的设置的子集。在这里得到回答:https://stackoverflow.com/a/29043170/378360