bitmath.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:3k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* libFLAC - Free Lossless Audio Codec library
  2.  * Copyright (C) 2001,2002,2003,2004,2005  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. #include "private/bitmath.h"
  32. #include "FLAC/assert.h"
  33. /* An example of what FLAC__bitmath_ilog2() computes:
  34.  *
  35.  * ilog2( 0) = assertion failure
  36.  * ilog2( 1) = 0
  37.  * ilog2( 2) = 1
  38.  * ilog2( 3) = 1
  39.  * ilog2( 4) = 2
  40.  * ilog2( 5) = 2
  41.  * ilog2( 6) = 2
  42.  * ilog2( 7) = 2
  43.  * ilog2( 8) = 3
  44.  * ilog2( 9) = 3
  45.  * ilog2(10) = 3
  46.  * ilog2(11) = 3
  47.  * ilog2(12) = 3
  48.  * ilog2(13) = 3
  49.  * ilog2(14) = 3
  50.  * ilog2(15) = 3
  51.  * ilog2(16) = 4
  52.  * ilog2(17) = 4
  53.  * ilog2(18) = 4
  54.  */
  55. unsigned FLAC__bitmath_ilog2(FLAC__uint32 v)
  56. {
  57. unsigned l = 0;
  58. FLAC__ASSERT(v > 0);
  59. while(v >>= 1)
  60. l++;
  61. return l;
  62. }
  63. unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v)
  64. {
  65. unsigned l = 0;
  66. FLAC__ASSERT(v > 0);
  67. while(v >>= 1)
  68. l++;
  69. return l;
  70. }
  71. /* An example of what FLAC__bitmath_silog2() computes:
  72.  *
  73.  * silog2(-10) = 5
  74.  * silog2(- 9) = 5
  75.  * silog2(- 8) = 4
  76.  * silog2(- 7) = 4
  77.  * silog2(- 6) = 4
  78.  * silog2(- 5) = 4
  79.  * silog2(- 4) = 3
  80.  * silog2(- 3) = 3
  81.  * silog2(- 2) = 2
  82.  * silog2(- 1) = 2
  83.  * silog2(  0) = 0
  84.  * silog2(  1) = 2
  85.  * silog2(  2) = 3
  86.  * silog2(  3) = 3
  87.  * silog2(  4) = 4
  88.  * silog2(  5) = 4
  89.  * silog2(  6) = 4
  90.  * silog2(  7) = 4
  91.  * silog2(  8) = 5
  92.  * silog2(  9) = 5
  93.  * silog2( 10) = 5
  94.  */
  95. unsigned FLAC__bitmath_silog2(int v)
  96. {
  97. while(1) {
  98. if(v == 0) {
  99. return 0;
  100. }
  101. else if(v > 0) {
  102. unsigned l = 0;
  103. while(v) {
  104. l++;
  105. v >>= 1;
  106. }
  107. return l+1;
  108. }
  109. else if(v == -1) {
  110. return 2;
  111. }
  112. else {
  113. v++;
  114. v = -v;
  115. }
  116. }
  117. }
  118. unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v)
  119. {
  120. while(1) {
  121. if(v == 0) {
  122. return 0;
  123. }
  124. else if(v > 0) {
  125. unsigned l = 0;
  126. while(v) {
  127. l++;
  128. v >>= 1;
  129. }
  130. return l+1;
  131. }
  132. else if(v == -1) {
  133. return 2;
  134. }
  135. else {
  136. v++;
  137. v = -v;
  138. }
  139. }
  140. }