diff --git a/Library/Convert.cpp b/Library/Convert.cpp index 2faccc9..4ac4df3 100644 --- a/Library/Convert.cpp +++ b/Library/Convert.cpp @@ -593,6 +593,43 @@ EXTERNC char *ultoa(unsigned long Value, char *Buffer, int Base) return reverse(Buffer, 0, i - 1); } +EXTERNC int log2(unsigned int n) +{ + if (n == 0) + { + error("log2(0) is undefined."); + return -1; + } + + int log = 0; + + if ((n & 0xFFFF0000) != 0) + { + n >>= 16; + log = 16; + } + + if (n >= 256) + { + n >>= 8; + log += 8; + } + + if (n >= 16) + { + n >>= 4; + log += 4; + } + + if (n >= 4) + { + n >>= 2; + log += 2; + } + + return log + (n >> 1); +} + EXTERNC void __chk_fail(void) __attribute__((__noreturn__)); __noreturn __always_inline static inline void __convert_chk_fail(void) diff --git a/include/convert.h b/include/convert.h index 70fe5c4..4072a8d 100644 --- a/include/convert.h +++ b/include/convert.h @@ -74,6 +74,7 @@ extern "C" int strcasecmp(const char *lhs, const char *rhs); char *strtok(char *src, const char *delim); long int strtol(const char *str, char **endptr, int base); + int log2(unsigned int n); void *__memcpy_chk(void *dest, const void *src, size_t len, size_t slen); void *__memset_chk(void *dest, int val, size_t len, size_t slen);