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