public static int GetOptimalBitsCount2(uint charsCount, out uint charsCountInBits, uint maxBitsCount = 64, bool base2BitsCount = false) { int result = 0; charsCountInBits = 0; int n1 = Base.LogBase2(charsCount); ulong uCharsCount = (ulong)charsCount; double charsCountLog = Math.Log(2, charsCount); double maxRatio = 0; for (int n = n1; n <= maxBitsCount; n++) { if (base2BitsCount && n % 8 != 0) { continue; } uint l1 = (uint)Math.Ceiling(n * charsCountLog); double ratio = (double)n / l1; if (ratio > maxRatio) { maxRatio = ratio; result = n; charsCountInBits = l1; } } return(result); }