log2ceiling and log2floor from brpc bits.h

// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file defines some bit utilities.

#ifndef BUTIL_BITS_H_
#define BUTIL_BITS_H_

#include "butil/basictypes.h"
#include "butil/logging.h"

namespace butil 
{
    namespace bits 
    {

        // Returns the integer i such as 2^i <= n < 2^(i+1)
        inline int Log2Floor(uint32_t n) 
        {
            if (n == 0)
                return -1;
            int log = 0;
            uint32_t value = n;
            for (int i = 4; i >= 0; --i) 
            {
                int shift = (1 << i);
                uint32_t x = value >> shift;
                if (x != 0)
                {
                    value = x;
                    log += shift;
                }
            }
            DCHECK_EQ(value, 1u);
            return log;
        }

        // Returns the integer i such as 2^(i-1) < n <= 2^i
        inline int Log2Ceiling(uint32_t n) 
        {
            if (n == 0) 
            {
                return -1;
            } 
            else 
            {
                // Log2Floor returns -1 for 0, so the following works correctly for n=1.
                return 1 + Log2Floor(n - 1);
            }
        }

    }  // namespace bits
}  // namespace butil

#endif  // BUTIL_BITS_H_
 

猜你喜欢

转载自blog.csdn.net/hintonic/article/details/81511005