Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * fls.c
4 : * finds the last (most significant) bit that is set
5 : *
6 : * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
7 : *
8 : *
9 : * IDENTIFICATION
10 : * src/port/fls.c
11 : *
12 : * This file was taken from FreeBSD to provide an implementation of fls()
13 : * for platforms that lack it. Note that the operating system's version may
14 : * be substantially more efficient than ours, since some platforms have an
15 : * assembly instruction that does exactly this.
16 : *
17 : * The FreeBSD copyright terms follow.
18 : */
19 :
20 : /*-
21 : * Copyright (c) 1990, 1993
22 : * The Regents of the University of California. All rights reserved.
23 : *
24 : * Redistribution and use in source and binary forms, with or without
25 : * modification, are permitted provided that the following conditions
26 : * are met:
27 : * 1. Redistributions of source code must retain the above copyright
28 : * notice, this list of conditions and the following disclaimer.
29 : * 2. Redistributions in binary form must reproduce the above copyright
30 : * notice, this list of conditions and the following disclaimer in the
31 : * documentation and/or other materials provided with the distribution.
32 : * 4. Neither the name of the University nor the names of its contributors
33 : * may be used to endorse or promote products derived from this software
34 : * without specific prior written permission.
35 : *
36 : * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
37 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39 : * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
40 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
42 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
44 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
45 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46 : * SUCH DAMAGE.
47 : */
48 :
49 : #include "c.h"
50 :
51 : /*
52 : * Find Last Set bit
53 : */
54 : int
55 134 : fls(int mask)
56 : {
57 : int bit;
58 :
59 134 : if (mask == 0)
60 68 : return (0);
61 236 : for (bit = 1; mask != 1; bit++)
62 170 : mask = (unsigned int) mask >> 1;
63 66 : return (bit);
64 : }
|