flac_bitmath.c 3.3 KB

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