SDL 3.0
SDL_bits.h File Reference
Include dependency graph for SDL_bits.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32 (Uint32 x)
SDL_FORCE_INLINE bool SDL_HasExactlyOneBitSet32 (Uint32 x)

Function Documentation

◆ SDL_HasExactlyOneBitSet32()

SDL_FORCE_INLINE bool SDL_HasExactlyOneBitSet32 ( Uint32 x)

Determine if a unsigned 32-bit value has exactly one bit set.

If there are no bits set (x is zero), or more than one bit set, this returns false. If any one bit is exclusively set, this returns true.

Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).

Parameters
xthe 32-bit value to examine.
Returns
true if exactly one bit is set in x, false otherwise.

\threadsafety It is safe to call this function from any thread.

Since
This function is available since SDL 3.2.0.

Definition at line 132 of file SDL_bits.h.

133{
134 if (x && !(x & (x - 1))) {
135 return true;
136 }
137 return false;
138}

References SDL_FORCE_INLINE.

◆ SDL_MostSignificantBitIndex32()

SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32 ( Uint32 x)

CategoryBits

Functions for fiddling with bits and bitmasks. Get the index of the most significant (set) bit in a 32-bit number.

This operation can also be stated as "count leading zeroes" and "log base 2".

Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).

Parameters
xthe 32-bit value to examine.
Returns
the index of the most significant bit, or -1 if the value is 0.

\threadsafety It is safe to call this function from any thread.

Since
This function is available since SDL 3.2.0.

Definition at line 65 of file SDL_bits.h.

66{
67#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
68 /* Count Leading Zeroes builtin in GCC.
69 * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html
70 */
71 if (x == 0) {
72 return -1;
73 }
74 return 31 - __builtin_clz(x);
75#elif defined(__WATCOMC__) && defined(__386__)
76 if (x == 0) {
77 return -1;
78 }
79 return _SDL_bsr_watcom(x);
80#elif defined(_MSC_VER) && _MSC_VER >= 1400
81 unsigned long index;
82 if (_BitScanReverse(&index, x)) {
83 return (int)index;
84 }
85 return -1;
86#else
87 /* Based off of Bit Twiddling Hacks by Sean Eron Anderson
88 * <seander@cs.stanford.edu>, released in the public domain.
89 * http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
90 */
91 const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
92 const int S[] = {1, 2, 4, 8, 16};
93
94 int msbIndex = 0;
95 int i;
96
97 if (x == 0) {
98 return -1;
99 }
100
101 for (i = 4; i >= 0; i--)
102 {
103 if (x & b[i])
104 {
105 x >>= S[i];
106 msbIndex |= S[i];
107 }
108 }
109
110 return msbIndex;
111#endif
112}
uint32_t Uint32
Definition SDL_stdinc.h:482

References SDL_FORCE_INLINE.