为什么这个位集集合算法不起作用
Why is this bitset collection algorithm not working?
这是我的目标:
-
创建长度为 N 的所有可能的位字符串。
-
一旦我创建了一个可能的字符串,我想一次获取 B 位,将它们隐藏到索引中,并使用该索引从以下字符串中获取字符:
define ALPHABET "abcdefghijklmnopqrstuvwxyz012345"
-
我想将每个字符添加到一个字符串中,然后在解析完所有位后打印字符串。
-
重复此操作,直到处理完所有可能的位字符串。
这是我的解决方案:
for (unsigned int i = 0; i < pow(2, N); i++) {
// Create bit set.
std::bitset <N> bits(i);
// String to hold characters.
std::string key_val;
// To hold B bits per time.
std::bitset <B> temp;
for (unsigned int j = 0; j < bits.size(); j++) {
// Add to bitset.
temp[j % B] = bits[j];
if (j % B == 0) {
key_val += ALPHABET[temp.to_ulong()];
}
}
std::cout << key_val << std::endl;
key_val.clear();
}
问题是这样的:
输出毫无意义。我可以看到该程序创建了非常奇怪的序列,这不是我所需要的。
理想情况下,输出应该是(我想要的(:
aaaaa
aaaab
aaaac
.
.
.
这是我得到的输出:
aaaaa
baaaa
acaaa
bcaaa
aeaaa
beaaa
agaaa
bgaaa
aiaaa
.
.
.
"追加字符"条件立即触发(j == 0(,这可能不是您想要的。如果位大小不是 B 的倍数,您还需要注意结尾
for (unsigned int j = 0; j < bits.size(); j++) {
// Add to bitset.
temp[j % B] = bits[j];
if (j % B == B - 1 || j == bits.size() - 1) {
key_val += ALPHABET[temp.to_ulong()];
}
}
编辑:与其单独循环所有位,不如执行以下操作:
for (int j = 0; j < bits.size(); j += B) {
key_val += ALPHABET[bits.to_ulong() % B];
bits >>= B;
}
PS:如果位适合循环变量,则根本不需要位集。
for (unsigned int i = 0; i < (1 << N); i++) {
std::string key_val;
for (unsigned int j = 0; j < bits.size(); j += B) {
key_val += ALPHABET[(i >> j) % B];
}
std::cout << key_val << std::endl;
}
附言如果您希望数字颠倒,您可能需要/需要在内部循环中倒计时
相关文章:
- 处理多个异常集合的C++方法
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 算法 - 集合中出现了多少次
- 为什么这个位集集合算法不起作用
- 我如何在C 中制作算法,以在不重复的情况下查找集合的变化(即n元素,选择k)
- 使用STL算法查找集合中的所有匹配项
- 将集合与集合进行比较的最佳算法
- 使用 STL 算法查找集合中的前两个不相邻元素
- 使用专用函数对异构集合的 STL 算法
- 从一组集合中找出所有不相交集合的算法是什么
- 在块集合中统一连续块的算法
- [唯一相等运算符]在集合中查找重复元素并将其分组的快速算法是什么
- 对于每个连接点集合,通过所有连接点一次的算法
- 计算包含某些项的列表集合的唯一排列的算法
- 输出或遍历集合的所有对组合的标准算法
- 将部分可编辑对象的集合传递给算法
- 贪心算法错误使用c++集合
- 对集合中的每个元素调用print的通用算法
- 生成一个集合的所有可能序列的并行算法