gpt4 book ai didi

c++ - 为什么这个 bitset 收集算法不起作用?

转载 作者:行者123 更新时间:2023-11-28 05:14:08 26 4
gpt4 key购买 nike

这是我的目标:

  1. 创建所有可能的长度为 N 的位串。

  2. 一旦我创建了一个可能的字符串,我想一次获取 B 位,将它们转换为一个索引,然后使用该索引从以下字符串中获取一个字符:

    define ALPHABET "abcdefghijklmnopqrstuvwxyz012345"
  3. 我想将每个字符添加到一个字符串中,然后在解析完所有位后打印该字符串。

  4. 重复直到处理完所有可能的位串。

这是我的解决方案:

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;
}

附注:如果位适合循环变量,则根本不需要位集。

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;
}

P.P.S. 如果您想要反转数字,您可能希望/需要在内循环中倒数

关于c++ - 为什么这个 bitset 收集算法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42989798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com