math_functions.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 111 行
HPP
111 行
////////////////////////////////////////////////////////////////////////////////// (C) Copyright Stephen Cleary 2000.// (C) Copyright Ion Gaztanaga 2007-2008.//// Distributed under the Boost Software License, Version 1.0.// (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt)//// See http://www.boost.org/libs/interprocess for documentation.//// This file is a slightly modified file from Boost.Pool////////////////////////////////////////////////////////////////////////////////#ifndef BOOST_INTERPROCESS_DETAIL_MATH_FUNCTIONS_HPP#define BOOST_INTERPROCESS_DETAIL_MATH_FUNCTIONS_HPP#include <climits>#include <boost/static_assert.hpp>namespace boost {namespace interprocess {namespace detail {// Greatest common divisor and least common multiple//// gcd is an algorithm that calculates the greatest common divisor of two// integers, using Euclid's algorithm.//// Pre: A > 0 && B > 0// Recommended: A > Btemplate <typename Integer>inline Integer gcd(Integer A, Integer B){ do { const Integer tmp(B); B = A % B; A = tmp; } while (B != 0); return A;}//// lcm is an algorithm that calculates the least common multiple of two// integers.//// Pre: A > 0 && B > 0// Recommended: A > Btemplate <typename Integer>inline Integer lcm(const Integer & A, const Integer & B){ Integer ret = A; ret /= gcd(A, B); ret *= B; return ret;}template <typename Integer>inline Integer log2_ceil(const Integer & A){ Integer i = 0; Integer power_of_2 = 1; while(power_of_2 < A){ power_of_2 <<= 1; ++i; } return i;}template <typename Integer>inline Integer upper_power_of_2(const Integer & A){ Integer power_of_2 = 1; while(power_of_2 < A){ power_of_2 <<= 1; } return power_of_2;}//This function uses binary search to discover the//highest set bit of the integerinline std::size_t floor_log2 (std::size_t x){ const std::size_t Bits = sizeof(std::size_t)*CHAR_BIT; const bool Size_t_Bits_Power_2= !(Bits & (Bits-1)); BOOST_STATIC_ASSERT(((Size_t_Bits_Power_2)== true)); std::size_t n = x; std::size_t log2 = 0; for(std::size_t shift = Bits >> 1; shift; shift >>= 1){ std::size_t tmp = n >> shift; if (tmp) log2 += shift, n = tmp; } return log2;}} // namespace detail} // namespace interprocess} // namespace boost#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?