- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否有一种算法可以生成二进制数的所有可能组合,其中只有某些位置的位可以更改,例如,我们具有以下位流,但是只有位置x
中标记的位可以更改(此示例具有可以更改以形成不同组合的8个位置,总计2 ^ 8):x00x0000x000000x00x00x000x000x
一种解决方案是首先将数字视为8位数字,然后只计算xxxxxxxx
的所有组合。
但是,这不能完全满足我的需求,因为稍后我想在线性移位寄存器(LFSR)中使用数字,目前,我正在寻找利用std::bitset
的答案。
最佳答案
因此,已经有一个答案。但是只是转储了代码,没有任何解释。不好。不确定,为什么接受。无论如何...
我想用另一种方法添加答案,并解释步骤。
基本上,如果要具有二进制数的所有组合,则可以简单地“计数”或“递增1”。 3位值的示例。这将是十进制的0、1、2、3、4、5、6、7和二进制000、001、010、011、100、101、110、111。您会发现这很简单。
如果我们回想起上学 bool(boolean) bool(boolean) 代数和一些自动机理论的上学时间,那么我们就会沉迷于该计数操作是如何在低水平完成的。我们总是翻转最低有效位,并且,如果从1过渡到0,那么我们基本上发生了溢出,还必须翻转下一位。这就是二进制加法器的原理。我们想在我们的例子中总是加1。因此,将1加0,结果为1,则没有溢出。但是将1加1,结果为0,那么我们有一个过高的情况,必须在下一位加1。这将有效地翻转下一位,依此类推。
这种方法的优点是,我们不必总是对所有位进行操作。因此,复杂度不是O(n),而是O(log n)。
附加优点:它非常适合您使用std::bitset
的请求。
第三个优点,也许不是那么明显:您可以将计算下一个组合的任务与程序的其余部分分离。无需在这种功能中集成您的实际任务代码。这也是为什么std::next_permutation
这样实现的原因。
并且,上面描述的算法适用于所有值,无需排序或任何必需的操作。
那部分是您要的算法。
下一部分是针对您的请求,仅某些位可以更改。当然,我们需要指定这些位。而且由于您正在使用std::bitset
屏蔽,因此这里没有解决方案。更好的方法是使用索引。含义,给出允许更改的位的位位置。
然后,我们可以使用上述算法,仅需一个附加的间接寻址。因此,我们不使用bits[pos]
,而是bits[index[pos]]
。
使用初始化列表可以轻松地将索引存储在std::vector
中。我们还可以从字符串或其他任何东西派生索引 vector 。我以std::string
为例。
以上所有内容将导致一些简短的代码,只有几行,并且易于理解。我还添加了一些使用此功能的驱动程序代码。
请参阅:
#include <iostream>
#include <vector>
#include <string>
#include <bitset>
#include <algorithm>
#include <cassert>
constexpr size_t BitSetSize = 32U;
void nextCombination(std::bitset<BitSetSize>& bits, const std::vector<size_t>& indices) {
for (size_t i{}; i < indices.size(); ++i) {
// Get the current index, and check, if it is valid
if (const size_t pos = indices[i]; pos < BitSetSize) {
// Flip bit at lowest positions
bits[pos].flip();
// If there is no transition of the just flipped bit, then stop
// If there is a transition from high to low, then we need to flip the next bit
if (bits.test(pos))
break;
}
}
}
// Some driver code
int main() {
// Use any kind of mechanism to indicate which index should be changed or not
std::string mask{ "x00x0000x000000x00x00x000x000x" };
// Here, we will store the indices
std::vector<size_t> index{};
// Populated the indices vector from the string
std::for_each(mask.crbegin(), mask.crend(), [&, i = 0U](const char c) mutable {if ('x' == c) index.push_back(i); ++i; });
// The bitset, for which we want to calculate the combinations
std::bitset<BitSetSize> bits(0);
// Play around
for (size_t combination{}; combination < (1 << (index.size())); ++combination) {
// This is the do something
std::cout << bits.to_string() << '\n';
// calculate the next permutation
nextCombination(bits, index);
}
return 0;
}
该软件已使用C++ 17通过MSVC 19社区版进行编译
关于c++ - 二进制数的所有组合,其中仅某些位可以更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62991708/
我有一个 mysql 表,其中包含一些随机数字组合。为简单起见,以下表为例: index|n1|n2|n3 1 1 2 3 2 4 10 32 3 3 10 4 4
我有以下代码: SELECT sdd.sd_doc_classification, sdd.sd_title, sdd.sd_desc, sdr.sd_upl
如果我有两个要合并的数据框 Date RollingSTD 01/06/2012 0.16 01/07/2012 0.18 01/08/2012 0.17 01/09/20
我知道可以使用 lein ring war 创建一个 war 文件,但它似乎仍然包含码头依赖项。当我构建 war (并在 tomcat 上部署)时,有没有办法排除码头依赖项? 如果我根本不能做这件事,
维基百科关于封装的文章指出: “封装还通过防止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性” 我在一个论坛上开始讨论封装,在那里我问你是否应该始终在 setter 和/或 gette
对于我使用的组合框内的复选框: AOEDComboAssociationName = new Ext.form.ComboBox({ id: 'AOEDComboAssociationName',
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do I combine LINQ expressions into one? public boo
如何在 rust 中找到排列或组合的数量? 例如C(10,6) = 210 我在标准库中找不到这个函数,也找不到那里的阶乘运算符(这就足够了)。 最佳答案 以@vallentin 的回答为基础,可以进
我有一个复杂的泛型类型用例,已在下面进行了简化 trait A class AB extends A{ val v = 10 } trait X[T<:A]{ def request: T }
如何使用 Hibernate 限制来实现此目的? (((A='X') and (B in('X',Y))) or ((A='Y') and (B='Z'))) 最佳答案 思考有效 Criteria c
我一定会在我的一个项目中使用谷歌图表。我需要的是,显示一个条形图,并且在条形图中,与每个条形相交的线代表另一个值。如果您查看下面的 jsfiddle,您会发现折线图仅与中间的条形图相交,并继续向其他条
只是一个简单的问题,我也很想得到答案,因为我不能百分百理解 Javascript 示例:假设您提示用户输入名称。够简单吧?但是你有一个数组,上面写着一些名字(其中之一就是),基本上就是我到目前为止所说
我试图通过 Haskell 理解函数式编程,但在处理函数组合时遇到了很多麻烦。 其实我有这两个功能: add:: Integer -> Integer -> Integer add x y = x
我正在寻找一种在 Realm 查询中组合 AND 和 OR 的方法。 这是我的课: class Event extends RealmObject { String id; String
例如,我有一个包含 5 个元素的哈希: my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 我的目标是每次循环哈希时都返回,但没
我是Combine 的新手,我想得到一个看似简单的东西。假设我有一个整数集合,例如: let myCollection = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 我想以例如 0
关于“优先组合而不是继承”的问题,我的老师是这样说的: 组合:现有类成为新类的组件 转发:新类中的每个实例方法,在现有类的包含实例上调用相应的方法并返回结果 包装器:新类封装了现有的 这三个概念我不是
我正在尝试将单个整数从 ASCII 值转换为 0 和 1。相关代码如下所示: int num1 = bin.charAt(0); int num2 = bin.charAt(1);
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我经常看到“嵌套”类中的非静态变
我尝试合并两个数据集(DataFrame),如下所示: D1 = pd.DataFrame({'Village':['Ampil','Ampil','Ampil','Bachey','Bachey',
我是一名优秀的程序员,十分优秀!