my_bit.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* Some useful bit functions */
  14. #include "mysys_priv.h"
  15. /*
  16.   Find smallest X in 2^X >= value
  17.   This can be used to divide a number with value by doing a shift instead
  18. */
  19. uint my_bit_log2(ulong value)
  20. {
  21.   uint bit;
  22.   for (bit=0 ; value > 1 ; value>>=1, bit++) ;
  23.   return bit;
  24. }
  25. static char nbits[256] = {
  26.   0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
  27.   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
  28.   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
  29.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  30.   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
  31.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  32.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  33.   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
  34.   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
  35.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  36.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  37.   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
  38.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  39.   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
  40.   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
  41.   4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
  42. };
  43. uint my_count_bits(ulonglong v)
  44. {
  45. #if SIZEOF_LONG_LONG > 4
  46.   /* The following code is a bit faster on 16 bit machines than if we would
  47.      only shift v */
  48.   ulong v2=(ulong) (v >> 32);
  49.   return (uint) (uchar) (nbits[(uchar)  v] +
  50.                          nbits[(uchar) (v >> 8)] +
  51.                          nbits[(uchar) (v >> 16)] +
  52.                          nbits[(uchar) (v >> 24)] +
  53.                          nbits[(uchar) (v2)] +
  54.                          nbits[(uchar) (v2 >> 8)] +
  55.                          nbits[(uchar) (v2 >> 16)] +
  56.                          nbits[(uchar) (v2 >> 24)]);
  57. #else
  58.   return (uint) (uchar) (nbits[(uchar)  v] +
  59.                          nbits[(uchar) (v >> 8)] +
  60.                          nbits[(uchar) (v >> 16)] +
  61.                          nbits[(uchar) (v >> 24)]);
  62. #endif
  63. }