按位比较效率

时间:2019-12-06 16:01:29

标签: c++ algorithm comparison

我有一个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)的复杂性。您能否提出有关复杂性或效率的解决方案的任何改进?可能还可以,但是我不确定。

注意:我需要知道该位置有误。

2 个答案:

答案 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