这个 bitset 生成可以做得更好或更有效率吗?
Can this bitset generation be made better or more efficient?
问题:给定一个整数led作为输入,用led[=创建一个位集(16位) 21=] 位设置为 1。然后,创建以下序列(假设在这种情况下 led = 7):
0000000001111111
0000000000111111
0000000001011111
0000000001101111
0000000001110111
0000000001111011
0000000001111101
0000000001111110
注意向右移动的是一个“零”。我写的代码是:
void create_mask(int led){
string bitString;
for (int i = 0; i < led; i++){
bitString += "1";
}
bitset<16> bitMap(bitString);
for (int i = led; i >= 0; i--){
bitMap[i] = false;
cout << bitMap << endl;
bitString = "";
for (int j = 0; j < led; j++){
bitString += "1";
}
bitMap = bitset<16> (bitString);
}
}
我不喜欢我将每个位都设置为 0 的嵌套循环。我认为可以通过降低复杂性来做得更好。
如果您想使用 std::bitset
,您可以利用移位和异或运算等位功能。在这个解决方案中,我有一个全部为 1 的基本位集,一个向右移动的掩码,并且我在每次迭代中输出两者的 XOR。
未测试。
void output_masks(int bits, std::ostream& os){
std::bitset<16> all_ones((1 << bits) - 1);
std::bitset<16> bit_mask(1 << (bits - 1));
while (bit_mask.any()) {
os << (all_ones ^ bit_mask);
bit_mask >>= 1;
}
}
这是我想出的:
void createMask(int len) {
std::bitset<16> bitMap;
for (int i = 1; i < len; i++)
{
bitMap.set();
bitMap >>= 16 - len;
bitMap[len - i] = false;
std::cout << bitMap << std::endl;
}
}
bitMap.set()
将位集中的所有位设置为 1(或真)
bitMap >>= 16 - len
将所有位向右移动,但它是 16 - 7(如果 len 为 7),所以有 9 个零和七个 1。
bitMap[len - i] = false
将位 7 - i 设置为 0(或假)。 len - i 是一种指定倒数的方法(基本上它开始在左侧设置零并根据 i 的值向右工作)
循环从 1 开始,因为无论如何您都将该位设置为 0 并防止程序在 len 为 16 时崩溃 –
问题:给定一个整数led作为输入,用led[=创建一个位集(16位) 21=] 位设置为 1。然后,创建以下序列(假设在这种情况下 led = 7):
0000000001111111 0000000000111111 0000000001011111 0000000001101111 0000000001110111 0000000001111011 0000000001111101 0000000001111110
注意向右移动的是一个“零”。我写的代码是:
void create_mask(int led){
string bitString;
for (int i = 0; i < led; i++){
bitString += "1";
}
bitset<16> bitMap(bitString);
for (int i = led; i >= 0; i--){
bitMap[i] = false;
cout << bitMap << endl;
bitString = "";
for (int j = 0; j < led; j++){
bitString += "1";
}
bitMap = bitset<16> (bitString);
}
}
我不喜欢我将每个位都设置为 0 的嵌套循环。我认为可以通过降低复杂性来做得更好。
如果您想使用 std::bitset
,您可以利用移位和异或运算等位功能。在这个解决方案中,我有一个全部为 1 的基本位集,一个向右移动的掩码,并且我在每次迭代中输出两者的 XOR。
未测试。
void output_masks(int bits, std::ostream& os){
std::bitset<16> all_ones((1 << bits) - 1);
std::bitset<16> bit_mask(1 << (bits - 1));
while (bit_mask.any()) {
os << (all_ones ^ bit_mask);
bit_mask >>= 1;
}
}
这是我想出的:
void createMask(int len) {
std::bitset<16> bitMap;
for (int i = 1; i < len; i++)
{
bitMap.set();
bitMap >>= 16 - len;
bitMap[len - i] = false;
std::cout << bitMap << std::endl;
}
}
bitMap.set()
将位集中的所有位设置为 1(或真)
bitMap >>= 16 - len
将所有位向右移动,但它是 16 - 7(如果 len 为 7),所以有 9 个零和七个 1。
bitMap[len - i] = false
将位 7 - i 设置为 0(或假)。 len - i 是一种指定倒数的方法(基本上它开始在左侧设置零并根据 i 的值向右工作)
循环从 1 开始,因为无论如何您都将该位设置为 0 并防止程序在 len 为 16 时崩溃 –