| // ----------------------------------------------------------- |
| // lowest_bit.hpp |
| // |
| // Position of the lowest bit 'on' |
| // |
| // Copyright (c) 2003-2004, 2008 Gennaro Prota |
| // |
| // 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) |
| // |
| // ----------------------------------------------------------- |
| |
| #ifndef BOOST_LOWEST_BIT_HPP_GP_20030301 |
| #define BOOST_LOWEST_BIT_HPP_GP_20030301 |
| |
| #include <assert.h> |
| #include "boost/pending/integer_log2.hpp" |
| |
| |
| namespace boost { |
| |
| template <typename T> |
| int lowest_bit(T x) { |
| |
| assert(x >= 1); // PRE |
| |
| // clear all bits on except the rightmost one, |
| // then calculate the logarithm base 2 |
| // |
| return boost::integer_log2<T>( x - ( x & (x-1) ) ); |
| |
| } |
| |
| |
| } |
| |
| |
| #endif // include guard |