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
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |