我想将任意长度的位流与c#中的掩码进行比较,并返回多少位相同的比率。
要检查的掩码长度在2位至8k之间(其中90%的掩码长度为5位),输入可以在2位之间,最高为〜500k,平均输入字符串为12k(但是,大多数情况下,它将比较5位与该12k的前5位)

现在,我的幼稚实现将是这样的:

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


但是我希望使用某种二进制运算符魔术可以更好地处理(更有效)?

任何人都有指针吗?

编辑:在我的设计中,数据类型目前还没有固定,因此,如果ints或bytearrays更好地工作,我也将是一个快乐的露营者,尝试在此处进行效率优化,计算越快越好。

例如,如果您可以使它像这样工作:

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


或这个:

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


回答:
我互相提出了每个建议的答案,而Fredou和Marten的解决方案并驾齐驱,但是Fredou最后提交了最快的精益实现。当然,由于平均结果在不同的实现之间有很大的不同,我稍后可能不得不重新审视这篇文章。 :),但这可能只是我弄乱了我的测试脚本。 (我希望现在为时已晚,去睡觉=)

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复制到这里,如果我破坏了您的修改权限,我知道。https://dotnetfiddle.net/h9nFSa

最佳答案

this one - dotnetfiddle example怎么样

using System;

namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            int a = Convert.ToInt32("0001101", 2);
            int b = Convert.ToInt32("1100101", 2);

            Console.WriteLine(dendrite(a, 4, b));

        }

        private static float dendrite(int mask, int len, int input)
        {
            return  1 - getBitCount(mask ^ (input & (int.MaxValue >> 32 - len))) / (float)len;
        }

        private static int getBitCount(int bits)
        {
            bits = bits - ((bits >> 1) & 0x55555555);
            bits = (bits & 0x33333333) + ((bits >> 2) & 0x33333333);
            return ((bits + (bits >> 4) & 0xf0f0f0f) * 0x1010101) >> 24;
        }
    }
}


64位1 here - dotnetfiddler

using System;

namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //                                                                                      1
            ulong a = Convert.ToUInt64("0000000000000000000000000000000000000000000000000000000000001101", 2);
            ulong b = Convert.ToUInt64("1110010101100101011001010110110101100101011001010110010101100101", 2);

            Console.WriteLine(dendrite(a, 4, b));

        }

        private static float dendrite(ulong mask, int len, ulong input)
        {
            return 1 - getBitCount(mask ^ (input & (ulong.MaxValue >> (64 - len)))) / (float)len;
        }

        private static ulong getBitCount(ulong bits)
        {
            bits = bits - ((bits >> 1) & 0x5555555555555555UL);
            bits = (bits & 0x3333333333333333UL) + ((bits >> 2) & 0x3333333333333333UL);
            return unchecked(((bits + (bits >> 4)) & 0xF0F0F0F0F0F0F0FUL) * 0x101010101010101UL) >> 56;
        }
    }
}

关于c# - 有效地比较位(x的重叠集),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33978150/

10-16 20:33