public static UInt32 TargetToBits(UInt256 target) { // to get the powerPart: take the log in base 2, round up to 8 to respect byte boundaries, and then remove 24 to represent 3 bytes of precision var log = Math.Ceiling(UInt256.Log(target, 2) / 8) * 8 - 24; var powerPart = (byte)(log / 8 + 3); // determine the multiplier based on the powerPart var multiplier = BigInteger.Pow(2, 8 * (powerPart - 3)); // to get multiplicand: divide the target by the multiplier //TODO var multiplicandBytes = ((BigInteger)target / (BigInteger)multiplier).ToByteArray(); Debug.Assert(multiplicandBytes.Length == 3 || multiplicandBytes.Length == 4); // this happens when multipicand would be greater than 0x7fffff // TODO need a better explanation comment if (multiplicandBytes.Last() == 0) { multiplicandBytes = multiplicandBytes.Skip(1).ToArray(); powerPart++; } // construct the bits representing the powerPart and multiplicand var bits = Bits.ToUInt32(multiplicandBytes.Concat(powerPart).ToArray()); return(bits); }