I want to compare a stream of bits of arbitrary length to a mask in c# and return a ratio of how many bits were the same. The mask to check against is anywhere between 2 bits long to 8k (with 90% of the masks being 5 bits long), the input can be anywhere between 2 bits up to ~ 500k, with an average input string of 12k (but yeah, most of the time it will be comparing 5 bits with the first 5 bits of that 12k)
Now my naive implementation would be something like this:
bool[] mask = new[] { true, true, false, true };
float dendrite(bool[] input) { 
    int correct = 0;
    for ( int i = 0; i<mask.length; i++ ) { 
        if ( input[i] == mask[i] ) 
            correct++;
    }
    return (float)correct/(float)mask.length;
}
but I expect this is better handled (more efficient) with some kind of binary operator magic?
Anyone got any pointers?
EDIT: the datatype is not fixed at this point in my design, so if ints or bytearrays work better, I'd also be a happy camper, trying to optimize for efficiency here, the faster the computation, the better.
eg if you can make it work like this:
int[] mask = new[] { 1, 1, 0, 1 };
float dendrite(int[] input) { 
    int correct = 0;
    for ( int i = 0; i<mask.length; i++ ) { 
        if ( input[i] == mask[i] ) 
            correct++;
    }
    return (float)correct/(float)mask.length;
}
or this:
int mask = 13; //1101
float dendrite(int input) { 
    return // your magic here;
} // would return 0.75 for an input 
  // of 101 given ( 1100101 in binary, 
  // matches 3 bits of the 4 bit mask == .75 
ANSWER: I ran each proposed answer against each other and Fredou's and Marten's solution ran neck to neck but Fredou submitted the fastest leanest implementation in the end. Of course since the average result varies quite wildly between implementations I might have to revisit this post later on. :) but that's probably just me messing up in my test script. ( i hope, too late now, going to bed =)
sparse1.Cyclone
1317ms   3467107ticks 10000iterations
result:    0,7851563
sparse1.Marten
288ms   759362ticks 10000iterations
result:    0,05066964
sparse1.Fredou
216ms   568747ticks 10000iterations
result:    0,8925781
sparse1.Marten
296ms   778862ticks 10000iterations
result:    0,05066964
sparse1.Fredou
216ms   568601ticks 10000iterations
result:    0,8925781
sparse1.Marten
300ms   789901ticks 10000iterations
result:    0,05066964
sparse1.Cyclone
1314ms   3457988ticks 10000iterations
result:    0,7851563
sparse1.Fredou
207ms   546606ticks 10000iterations
result:    0,8925781
sparse1.Marten
298ms   786352ticks 10000iterations
result:    0,05066964
sparse1.Cyclone
1301ms   3422611ticks 10000iterations
result:    0,7851563
sparse1.Marten
292ms   769850ticks 10000iterations
result:    0,05066964
sparse1.Cyclone
1305ms   3433320ticks 10000iterations
result:    0,7851563
sparse1.Fredou
209ms   551178ticks 10000iterations
result:    0,8925781
( testscript copied here, if i destroyed yours modifying it lemme know. https://dotnetfiddle.net/h9nFSa )
 
     
     
    