我有一个uint8_t
类型的数组。 0表示“ OK”,1表示“ ERROR”。每一位代表一个不同的系统。
如果在一秒钟内检测到任何错误,我必须调用错误功能。我的解决方案如下:
const int arrSize = 3;
void bitComparator() {
uint8_t myArr[arrSize] = {0, 1, 64}; //array storing system status
uint8_t mask; //bit mask
uint8_t maskResult;
for(int i=0; i<arrSize; i++) {
mask = 1; // mask is 0000 0001
for(int j=0; j<8; j++) {
maskResult = mask & myArr[i];
if(maskResult != 0) errFunc(i, j);
mask <<= 1;
}
}
如果myArr
的宽度等于n,那么解决方案就是O(n)
的复杂性。您能否提出有关复杂性或效率的解决方案的任何改进?可能还可以,但是我不确定。
注意:我需要知道该位置有误。
答案 0 :(得分:1)
由于您需要为每个设置的位调用errFunc
,所以您需要一个O(N)
解决方案,因为您必须访问每个位。您可以使生活更轻松一些,并使用std::bitset
,它将使代码看起来像
void errFunc(int index, int bit)
{
std::cout << "Error in index " << index << " bit " << bit << "\n";
}
const int arrSize = 3;
void bitComparator()
{
uint8_t myArr[arrSize] = {0, 1, 64}; //array storing system status
for(int i=0; i<arrSize; i++)
{
std::bitset<8> bitset{myArr[i]};
for(int j=0; j<8; j++)
{
if(bitset[j])
errFunc(i, j);
}
}
}
int main()
{
bitComparator();
}
其输出为
Error in index 1 bit 0
Error in index 2 bit 6
答案 1 :(得分:1)
错误有多普遍?也就是说,大多数时候会不会有一堆位?如果没有,请分而治之:
if (myArr[i] != 0)
if(myArr[i] & 0x0F)
// process low 4 bits
if (myArr[i] & 0xF0)
// process high 4 bits