36 lines
		
	
	
		
			938 B
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			36 lines
		
	
	
		
			938 B
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha.audio2.ogg.tools; | ||
|  | 
 | ||
|  | /** | ||
|  |  * ... | ||
|  |  * @author shohei909 | ||
|  |  */ | ||
|  | class MathTools | ||
|  | { | ||
|  |     public static inline function ilog(n:Int) | ||
|  |     { | ||
|  |         var log2_4 = [0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4]; | ||
|  |          | ||
|  |         // 2 compares if n < 16, 3 compares otherwise (4 if signed or n > 1<<29) | ||
|  |         return if (n < (1 << 14)) { | ||
|  |             if (n < (1 <<  4)) { | ||
|  |                 0 + log2_4[n]; | ||
|  |             } else if (n < (1 << 9)) { | ||
|  |                 5 + log2_4[n >>  5]; | ||
|  |             } else { | ||
|  |                 10 + log2_4[n >> 10]; | ||
|  |             } | ||
|  |         } else if (n < (1 << 24)) { | ||
|  |             if (n < (1 << 19)) { | ||
|  |                 15 + log2_4[n >> 15]; | ||
|  |             } else { | ||
|  |                 20 + log2_4[n >> 20]; | ||
|  |             } | ||
|  |         } else if (n < (1 << 29)) { | ||
|  |             25 + log2_4[n >> 25]; | ||
|  |         } else if (n < (1 << 31)) { | ||
|  |             30 + log2_4[n >> 30]; | ||
|  |         } else { | ||
|  |             0; // signed n returns 0 | ||
|  |         } | ||
|  |     } | ||
|  | } |