为什么这个 bitset 收集算法不起作用?
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
.
.
.
"append character" 条件立即触发 (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;
}
P.S.: 如果位适合循环变量,则根本不需要位集。
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. 如果您想要反转数字,您可能希望/需要在内循环中倒计时
这是我的目标:
创建长度为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
.
.
.
"append character" 条件立即触发 (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;
}
P.S.: 如果位适合循环变量,则根本不需要位集。
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. 如果您想要反转数字,您可能希望/需要在内循环中倒计时