using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Threading.Tasks;
private static ulong[] masks = new ulong[]
20, 300, 12, 65535, 3223, 1234, 12, 655352
private static ulong[] data = new ulong[]
12000, 232, 2323, 31212, 131232232323, 12332, 2313213132, 3232, 32312, 5454, 2, 958454, 54, 4545,
454545, 45543543534, 53454353, 5544443, 244535353, 35353433434, 35353, 53534212344, 34344343, 43434434,
334444433443, 3434334434343, 34224323, 2432, 23333, 3332, 2232322332323, 334343, 22323, 32223, 1, 3232, 32,
12, 3, 231345353, 1332, 2
public static void Main(string[] args)
IDendrite[] dendrites = new IDendrite[] { new Cyclone(), new Marten(), new Fredou(), new Marten(), new Cyclone(), new Fredou(), new Fredou(), new Cyclone(), new Marten() };
Stopwatch sw = new Stopwatch();
StringBuilder sb = new StringBuilder();
float[] results = new float[0];
foreach (IDendrite dendrite in dendrites)
results = new float[masks.Length];
foreach (var input in data)
for (int i = 0, l = masks.Length; i < l; i++)
results[i] = dendrite.dendrite(masks[i], 64, input);
sb.AppendFormat("{0}\n" +
"{1}ms {2}ticks {3}iterations\nresult: {4}\n",
sw.ElapsedMilliseconds.ToString(),
sw.ElapsedTicks.ToString(), iter.ToString(),
results.Average().ToString());
var wtf = sw.ElapsedTicks;
Console.WriteLine(sb.ToString());
float dendrite(ulong mask, int len, ulong input);
public float dendrite(ulong mask, int len, ulong input)
return 1 - getBitCount(mask ^ (input & (ulong.MaxValue >> (64 - len)))) / (float)len;
private ulong getBitCount(ulong bits)
bits = bits - ((bits >> 1) & 0x5555555555555555UL);
bits = (bits & 0x3333333333333333UL) + ((bits >> 2) & 0x3333333333333333UL);
return unchecked(((bits + (bits >> 4)) & 0xF0F0F0F0F0F0F0FUL) * 0x101010101010101UL) >> 56;
public float dendrite(ulong mask, int len, ulong input)
ulong samebits = mask & ~(input ^ mask);
int correct = cardinality(samebits);
int inmask = cardinality(mask);
return inmask == 0 ? 0f : correct / (float)inmask;
static int cardinality(ulong word)
const ulong mult = 0x0101010101010101;
const ulong mask1h = (~0UL) / 3 << 1;
const ulong mask2l = (~0UL) / 5;
const ulong mask4l = (~0UL) / 17;
word -= (mask1h & word) >> 1;
word = (word & mask2l) + ((word >> 2) & mask2l);
return (int)((word * mult) >> 56);
class Cyclone : IDendrite
public float dendrite(ulong mask, int len, ulong input)
ulong xored = input ^ mask;
for (int i = 0; i < len; i++)
if (0==(xored & (ulong)(1 << i)))
return (float) correct/64;