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.1.3.

Definition at line 133 of file SDL_bits.h.

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

◆ 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.

Result is undefined when called with 0. 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.1.3.

Definition at line 66 of file SDL_bits.h.

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