为什么这个位集集合算法不起作用

Why is this bitset collection algorithm not working?

本文关键字:集合 算法 不起作用 为什么      更新时间:2023-10-16

这是我的目标:

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

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

附言如果您希望数字颠倒,您可能需要/需要在内部循环中倒计时