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
							 |