C++ 位比较效率

C++ 位比较效率,c++,algorithm,comparison,C++,Algorithm,Comparison,我有一个类型为uint8\u t的数组。位中的0表示“正常”,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; f

我有一个类型为
uint8\u t
的数组。位中的0表示“正常”,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;
  }
}
const int arrSize=3;
空位比较器(){
uint8_t myArr[arrSize]={0,1,64};//存储系统状态的数组
uint8\u t掩码;//位掩码
uint8_t maskResult;

对于(int i=0;i由于您需要为每个设置位调用
errFunc
,因此您需要一个
O(N)
解决方案,因为您必须访问每个位。您可以使生活更轻松,并使用

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();
}

错误有多常见?也就是说,在大多数情况下是否会设置一组位?如果不是,则分而治之:

if (myArr[i] != 0)
    if(myArr[i] & 0x0F)
        // process low 4 bits
    if (myArr[i] & 0xF0)
        // process high 4 bits

@Tim他还需要知道位置,而不仅仅是计数。类似于
vector
,其中第一个向量由
uint8
的值索引,第二个
vector
是一个真位列表,值就是位置。当你需要读取所有字节时,你不能比读取所有字节做得更好。不确定如何读取你想避免两条注释。首先,如果
myArr[i]
为0,您不必检查它的单个位。其次,您在实际问题中处理了多少位,您需要多久检查一次?除非是大量位和非常高的检查频率,否则我怀疑此代码是否会成为瓶颈。如果您希望数据在大多数时间都能正常通过e、 在检查每个位之前,可以尝试使用掩码
00000000
比较
myArr
,而不是每次逐位比较。如果它与
00000000
相同,则没有错误,不需要检查单个位。这仍然是O(n),但将是较小的O(n)比您当前实现的要快。只有在大多数情况下没有失败位时,这才会明显加快。否则分支可能会消除任何加速。
process
是否意味着像原始代码一样屏蔽位?@erdemtunna——它意味着“process”。可以通过屏蔽单个位,也可以通过再次分治。既然您提到实际问题涉及64位,我将使用64位无符号整数类型来保存位(而不是8位整数的数组)。检查无错误很简单,如果有错误,您可以将其拆分几次,然后再恢复到屏蔽单个BIG。如果低位和高位都有错误,该怎么办?我明白您的意思,但如果出现错误代码
01000110
,这将导致意外行为encountered@alteredinstance——哎哟,代码输入错误。修复了。谢谢。不用担心——我现在唯一想知道的是,在可能是线性代码的情况下进行如此多次的分支是多么昂贵。如果使用64位错误代码@erdemtunna,这可能会节约很多时间。对于较小的错误代码(8/16位)然而,使用if语句进行分而治之在运行时弊大于利!
if (myArr[i] != 0)
    if(myArr[i] & 0x0F)
        // process low 4 bits
    if (myArr[i] & 0xF0)
        // process high 4 bits