lowest_bit.hpp 919 B

123456789101112131415161718192021222324252627282930313233343536373839
  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. #ifndef BOOST_LOWEST_BIT_HPP_GP_20030301
  14. #define BOOST_LOWEST_BIT_HPP_GP_20030301
  15. #include "boost/integer/integer_log2.hpp"
  16. #include "boost/assert.hpp"
  17. namespace boost {
  18. namespace detail {
  19. template <typename T>
  20. int lowest_bit(T x) {
  21. BOOST_ASSERT(x >= 1); // PRE
  22. // clear all bits on except the rightmost one,
  23. // then calculate the logarithm base 2
  24. //
  25. return boost::integer_log2<T>( x - ( x & (x-1) ) );
  26. }
  27. }
  28. }
  29. #endif // include guard