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

Why is this bitset collection algorithm not working?

这是我的目标:

  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
.
.
.

"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. 如果您想要反转数字,您可能希望/需要在内循环中倒计时