40 lines
925 B
C++
40 lines
925 B
C++
|
// -----------------------------------------------------------
|
||
|
// 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
|