Skip to content
Snippets Groups Projects
ilog2.hh 933 B
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Copyright (C) 2013 Cloudius Systems, Ltd.
     *
     * This work is open source software, licensed under the terms of the
     * BSD license as described in the LICENSE file in the top-level directory.
     */
    
    
    #ifndef OSV_ILOG2_HH
    #define OSV_ILOG2_HH
    
    #include <cstdint>
    
    constexpr unsigned ilog2_roundup_constexpr(std::uintmax_t n)
    {
        return n <= 1 ? 0 : 1 + ilog2_roundup_constexpr((n >> 1) + (n & 1));
    }
    
    
    inline unsigned count_leading_zeros(unsigned n)
    {
        return __builtin_clz(n);
    }
    
    inline unsigned count_leading_zeros(unsigned long n)
    {
        return __builtin_clzl(n);
    }
    
    inline unsigned count_leading_zeros(unsigned long long n)
    {
        return __builtin_clzll(n);
    }
    
    template <typename T>
    inline
    unsigned ilog2_roundup(T n)
    {
        if (n <= 1) {
            return 0;
        }
        return sizeof(T)*8 - count_leading_zeros(n - 1);
    }
    
    
    template <typename T>
    inline constexpr
    bool is_power_of_two(T n)
    {
        return (n & (n - 1)) == 0;
    }