williamr@2: // ------------------------------------- williamr@2: // lowest_bit.hpp williamr@2: // williamr@2: // Position of the lowest bit 'on' williamr@2: // williamr@2: // (C) Copyright Gennaro Prota 2003 - 2004. williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. williamr@2: // (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // ------------------------------------------------------ williamr@2: williamr@2: #ifndef BOOST_LOWEST_BIT_HPP_GP_20030301 williamr@2: #define BOOST_LOWEST_BIT_HPP_GP_20030301 williamr@2: williamr@2: #include williamr@2: #include "boost/pending/integer_log2.hpp" williamr@2: williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: template williamr@2: int lowest_bit(T x) { williamr@2: williamr@2: assert(x >= 1); // PRE williamr@2: williamr@2: // clear all bits on except the rightmost one, williamr@2: // then calculate the logarithm base 2 williamr@2: // williamr@2: return boost::integer_log2( x - ( x & (x-1) ) ); williamr@2: williamr@2: } williamr@2: williamr@2: williamr@2: } williamr@2: williamr@2: williamr@2: #endif // include guard