tlx
Loading...
Searching...
No Matches
ffs.hpp
Go to the documentation of this file.
1/*******************************************************************************
2 * tlx/math/ffs.hpp
3 *
4 * ffs() find first set bit in integer - mainly for portability as ffs() is a
5 * glibc extension and not available on Visual Studio.
6 *
7 * Part of tlx - http://panthema.net/tlx
8 *
9 * Copyright (C) 2007-2017 Timo Bingmann <tb@panthema.net>
10 *
11 * All rights reserved. Published under the Boost Software License, Version 1.0
12 ******************************************************************************/
13
14#ifndef TLX_MATH_FFS_HEADER
15#define TLX_MATH_FFS_HEADER
16
17namespace tlx {
18
19//! \addtogroup tlx_math
20//! \{
21
22/******************************************************************************/
23// ffs() - find first set bit in integer
24
25//! ffs (find first set bit) - generic implementation
26template <typename Integral>
27static inline unsigned ffs_template(Integral x) {
28 if (x == 0) return 0u;
29 unsigned r = 1;
30 while ((x & 1) == 0)
31 x >>= 1, ++r;
32 return r;
33}
34
35/******************************************************************************/
36
37#if defined(__GNUC__) || defined(__clang__)
38
39//! find first set bit in integer, or zero if none are set.
40static inline
41unsigned ffs(int i) {
42 return static_cast<unsigned>(__builtin_ffs(i));
43}
44
45//! find first set bit in integer, or zero if none are set.
46static inline
47unsigned ffs(unsigned i) {
48 return ffs(static_cast<int>(i));
49}
50
51//! find first set bit in integer, or zero if none are set.
52static inline
53unsigned ffs(long i) {
54 return static_cast<unsigned>(__builtin_ffsl(i));
55}
56
57//! find first set bit in integer, or zero if none are set.
58static inline
59unsigned ffs(unsigned long i) {
60 return ffs(static_cast<long>(i));
61}
62
63//! find first set bit in integer, or zero if none are set.
64static inline
65unsigned ffs(long long i) {
66 return static_cast<unsigned>(__builtin_ffsll(i));
67}
68
69//! find first set bit in integer, or zero if none are set.
70static inline
71unsigned ffs(unsigned long long i) {
72 return ffs(static_cast<long long>(i));
73}
74
75#else
76
77//! find first set bit in integer, or zero if none are set.
78static inline
79unsigned ffs(int i) {
80 return ffs_template(i);
81}
82
83//! find first set bit in integer, or zero if none are set.
84static inline
85unsigned ffs(unsigned int i) {
86 return ffs_template(i);
87}
88
89//! find first set bit in integer, or zero if none are set.
90static inline
91unsigned ffs(long i) {
92 return ffs_template(i);
93}
94
95//! find first set bit in integer, or zero if none are set.
96static inline
97unsigned ffs(unsigned long i) {
98 return ffs_template(i);
99}
100
101//! find first set bit in integer, or zero if none are set.
102static inline
103unsigned ffs(long long i) {
104 return ffs_template(i);
105}
106
107//! find first set bit in integer, or zero if none are set.
108static inline
109unsigned ffs(unsigned long long i) {
110 return ffs_template(i);
111}
112
113#endif
114
115//! \}
116
117} // namespace tlx
118
119#endif // !TLX_MATH_FFS_HEADER
120
121/******************************************************************************/
static unsigned ffs_template(Integral x)
ffs (find first set bit) - generic implementation
Definition ffs.hpp:27
static unsigned ffs(int i)
find first set bit in integer, or zero if none are set.
Definition ffs.hpp:79