From: Christian Brauner Date: Wed, 18 Oct 2017 19:20:37 +0000 (+0200) Subject: utils: add lxc_find_next_power2() X-Git-Tag: lxc-2.0.10~615 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b38945f9847ff2aad1a8b37b59d923cbc61f3eb;p=thirdparty%2Flxc.git utils: add lxc_find_next_power2() Signed-off-by: Christian Brauner --- diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 887afdd03..bb3ac4e9b 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -2515,3 +2515,21 @@ int parse_byte_size_string(const char *s, int64_t *converted) *converted = overflow; return 0; } + +uint64_t lxc_find_next_power2(uint64_t n) +{ + /* 0 is not valid input. We return 0 to the caller since 0 is not a + * valid power of two. + */ + if (n == 0) + return 0; + + if (!(n & (n - 1))) + return n; + + while (n & (n - 1)) + n = n & (n - 1); + + n = n << 1; + return n; +} diff --git a/src/lxc/utils.h b/src/lxc/utils.h index 62c2d3c72..c96ce8ae6 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -462,4 +462,14 @@ extern bool lxc_nic_exists(char *nic); extern int lxc_make_tmpfile(char *template, bool rm); extern uint64_t lxc_getpagesize(void); +/* If n is not a power of 2 this function will return the next power of 2 + * greater than that number. Note that this function always returns the *next* + * power of 2 *greater* that number not the *nearest*. For example, passing 1025 + * as argument this function will return 2048 although the closest power of 2 + * would be 1024. + * If the caller passes in 0 they will receive 0 in return since this is invalid + * input and 0 is not a power of 2. + */ +extern uint64_t lxc_find_next_power2(uint64_t n); + #endif /* __LXC_UTILS_H */