public static ulong Map(long src, long dest) { int msbid = (int)Bitscan.ReverseIndex64((ulong)dest); ulong bitmask = 0xFFFFFFFFFFFFFFFF >> (63 - msbid); ulong subsrc, sumsub = 0, _src = (ulong)src, _dest = (ulong)dest; for (; ;) { subsrc = (_src & bitmask); if (subsrc > _dest) { subsrc -= _dest; } sumsub += subsrc; if (sumsub > _dest) { sumsub -= _dest; } _src >>= msbid; if (_src == 0) { return(sumsub); } } }
public static int MsbId(ulong dest) { return((int)Bitscan.ReverseIndex64(dest)); }
public static ulong Mask(ulong dest) { int msbId = (int)Bitscan.ReverseIndex64(dest); return(0xFFFFFFFFFFFFFFFF >> (63 - msbId)); }