1 /* libFLAC - Free Lossless Audio Codec library 2 * Copyright (C) 2001-2009 Josh Coalson 3 * Copyright (C) 2011-2014 Xiph.Org Foundation 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * - Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * - Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * - Neither the name of the Xiph.org Foundation nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #ifdef HAVE_CONFIG_H 34 # include <config.h> 35 #endif 36 37 #include "private/bitmath.h" 38 39 /* An example of what FLAC__bitmath_silog2() computes: 40 * 41 * silog2(-10) = 5 42 * silog2(- 9) = 5 43 * silog2(- 8) = 4 44 * silog2(- 7) = 4 45 * silog2(- 6) = 4 46 * silog2(- 5) = 4 47 * silog2(- 4) = 3 48 * silog2(- 3) = 3 49 * silog2(- 2) = 2 50 * silog2(- 1) = 2 51 * silog2( 0) = 0 52 * silog2( 1) = 2 53 * silog2( 2) = 3 54 * silog2( 3) = 3 55 * silog2( 4) = 4 56 * silog2( 5) = 4 57 * silog2( 6) = 4 58 * silog2( 7) = 4 59 * silog2( 8) = 5 60 * silog2( 9) = 5 61 * silog2( 10) = 5 62 */ 63 unsigned FLAC__bitmath_silog2(int v) 64 { 65 while(1) { 66 if(v == 0) { 67 return 0; 68 } 69 else if(v > 0) { 70 unsigned l = 0; 71 while(v) { 72 l++; 73 v >>= 1; 74 } 75 return l+1; 76 } 77 else if(v == -1) { 78 return 2; 79 } 80 else { 81 v++; 82 v = -v; 83 } 84 } 85 } 86 87 unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v) 88 { 89 while(1) { 90 if(v == 0) { 91 return 0; 92 } 93 else if(v > 0) { 94 unsigned l = 0; 95 while(v) { 96 l++; 97 v >>= 1; 98 } 99 return l+1; 100 } 101 else if(v == -1) { 102 return 2; 103 } 104 else { 105 v++; 106 v = -v; 107 } 108 } 109 } 110