c ++位掩码:代码块的解释
c++ bitmask: explanation of a code block
我是 C++ 的新手,我在理解位掩码方面有一些困难。如果有人能以最简单的方式描述以下代码的工作原理(http://rosettacode.org/wiki/Combinations#C.2B.2B):
#include <algorithm>
#include <iostream>
#include <string>
void comb(int N, int K)
{
std::string bitmask(K, 1); // K leading 1's
bitmask.resize(N, 0); // N-K trailing 0's
// print integers and permute bitmask
do {
for (int i = 0; i < N; ++i) // [0..N-1] integers
{
if (bitmask[i]) std::cout << " " << i;
}
std::cout << std::endl;
} while (std::prev_permutation(bitmask.begin(), bitmask.end()));
}
int main()
{
comb(5, 3);
}
我明白这段代码的用途和输出是什么,但我不明白字符串位掩码 std::string bitmask(K, 1)
的初始化以及 resize(N, 0)
的作用。
std::string bitmask(K, 1)
创建一个名为 bitmask
的字符串,并使用 K
个字符 1
实例对其进行初始化(注意,不是 字符 '1'
).
然后 bitmask.resize(N, 0)
将字符串的大小调整为 N
,并用字符 0
填充任何空白(再次注意 而不是 字符 '1'
)
所以如果 'K' 是 2
并且 N
是 5
,你最终会得到一个包含不可打印字符的字符串 1 1 0 0 0
在我看来,代码存在一些问题 - 首先,构造函数和 resize
应该传递 '0'
和 '1'
,而不是 0
和 1
。其次,它不适合 N
小于 K
的情况
我是 C++ 的新手,我在理解位掩码方面有一些困难。如果有人能以最简单的方式描述以下代码的工作原理(http://rosettacode.org/wiki/Combinations#C.2B.2B):
#include <algorithm>
#include <iostream>
#include <string>
void comb(int N, int K)
{
std::string bitmask(K, 1); // K leading 1's
bitmask.resize(N, 0); // N-K trailing 0's
// print integers and permute bitmask
do {
for (int i = 0; i < N; ++i) // [0..N-1] integers
{
if (bitmask[i]) std::cout << " " << i;
}
std::cout << std::endl;
} while (std::prev_permutation(bitmask.begin(), bitmask.end()));
}
int main()
{
comb(5, 3);
}
我明白这段代码的用途和输出是什么,但我不明白字符串位掩码 std::string bitmask(K, 1)
的初始化以及 resize(N, 0)
的作用。
std::string bitmask(K, 1)
创建一个名为 bitmask
的字符串,并使用 K
个字符 1
实例对其进行初始化(注意,不是 字符 '1'
).
然后 bitmask.resize(N, 0)
将字符串的大小调整为 N
,并用字符 0
填充任何空白(再次注意 而不是 字符 '1'
)
所以如果 'K' 是 2
并且 N
是 5
,你最终会得到一个包含不可打印字符的字符串 1 1 0 0 0
在我看来,代码存在一些问题 - 首先,构造函数和 resize
应该传递 '0'
和 '1'
,而不是 0
和 1
。其次,它不适合 N
小于 K