#include #include #define uint64 long long unsigned #define int64 long long static void nearest_powers(uint64 value, uint64 *lower, uint64 *upper) { uint64 power = 1UL << 12; if (lower) *lower = power; while (value >= power) { if (lower) *lower = power; power <<= 1; } if (upper) *upper = power; } int64 sols[5]; int solCount; int64 props[5]; static void find_nearest(uint64 value, int iteration) { if (iteration > 4 || (iteration + 1) >= solCount) return; uint64 down, up; int i; nearest_powers(value, &down, &up); props[iteration] = down; if (value - down < 0x100000) { for (i=0; i<=iteration; i++) sols[i] = props[i]; solCount = iteration + 1; return; } find_nearest(value - down, iteration + 1); props[iteration] = -up; if (up - value < 0x100000) { for (i=0; i<=iteration; i++) sols[i] = props[i]; solCount = iteration + 1; return; } find_nearest(up - value, iteration + 1); } int main() { uint64 length = 0xbfee0000; // 0xdfee0000; // 0x9ffb0000; //0xa7f00000; //0x70000000; //0xbfee0000; uint64 base = 0; solCount = 5; find_nearest(length, 0); printf("sols "); int i; for (i=0; i