1 // ----------------------------------------------------------- 2 // lowest_bit.hpp 3 // 4 // Position of the lowest bit 'on' 5 // 6 // Copyright (c) 2003-2004, 2008 Gennaro Prota 7 // 8 // Distributed under the Boost Software License, Version 1.0. 9 // (See accompanying file LICENSE_1_0.txt or copy at 10 // http://www.boost.org/LICENSE_1_0.txt) 11 // 12 // ----------------------------------------------------------- 13 14 #ifndef BOOST_LOWEST_BIT_HPP_GP_20030301 15 #define BOOST_LOWEST_BIT_HPP_GP_20030301 16 17 #include "boost/integer/integer_log2.hpp" 18 #include "boost/assert.hpp" 19 20 namespace boost { 21 namespace detail { 22 23 template <typename T> lowest_bit(T x)24 int lowest_bit(T x) { 25 26 BOOST_ASSERT(x >= 1); // PRE 27 28 // clear all bits on except the rightmost one, 29 // then calculate the logarithm base 2 30 // 31 return boost::integer_log2<T>( x - ( x & (x-1) ) ); 32 33 } 34 35 } 36 } 37 38 39 #endif // include guard 40