C++ 此位集生成是否可以更好或更高效?
问题:给定一个整数led作为输入,创建一个16位的位集,led位设置为1。然后,创建以下序列,假设在这种情况下led=7: 0000000001111111 0000000000111111 0000000001011111 0000000001101111 0000000001110111 0000000001111011 0000000001111101 0000000001111110 请注意,它是一个向右移动的零。我写的代码是:C++ 此位集生成是否可以更好或更高效?,c++,mask,bitset,C++,Mask,Bitset,问题:给定一个整数led作为输入,创建一个16位的位集,led位设置为1。然后,创建以下序列,假设在这种情况下led=7: 0000000001111111 0000000000111111 0000000001011111 0000000001101111 0000000001110111 0000000001111011 0000000001111101 0000000001111110 请注意,它是一个向右移动的零。我写的代码是: void create_mask(int led){
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;
}
}
这就是我想到的: 无效创建马斯金透镜{ 位集位图; 对于int i=1;i
循环从1开始,因为您正在将位设置为0,以防止程序在len为16时崩溃–这里的限制因素可能是LED点亮、人眼识别和LED熄灭所需的时间。尝试优化已经比物理设备i快10000倍的代码t的驾驶是一件愚蠢的差事。但是看看std::string构造函数的文档。有一个构造函数可以让字符串立即充满1,而不是附加一堆1。@JohnFilleau哦,它与物理led完全无关。它是一个用来解决UVA问题的函数:什么是UVA?我不熟悉它在首字母缩写中,您可以从整数创建位集,而不是从字符串创建位集。