SDL  2.0
SDL_bits.h File Reference
#include "SDL_stdinc.h"
#include "begin_code.h"
#include "close_code.h"
+ Include dependency graph for SDL_bits.h:

Go to the source code of this file.

Functions

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

Detailed Description

Functions for fiddling with bits and bitmasks.

Definition in file SDL_bits.h.

Function Documentation

◆ SDL_HasExactlyOneBitSet32()

SDL_FORCE_INLINE SDL_bool SDL_HasExactlyOneBitSet32 ( Uint32  x)

Definition at line 105 of file SDL_bits.h.

References SDL_FALSE, and SDL_TRUE.

106 {
107  if (x && !(x & (x - 1))) {
108  return SDL_TRUE;
109  }
110  return SDL_FALSE;
111 }

◆ SDL_MostSignificantBitIndex32()

SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32 ( Uint32  x)

Get the index of the most significant bit. Result is undefined when called with 0. This operation can also be stated as "count leading zeroes" and "log base 2".

Returns
Index of the most significant bit, or -1 if the value is 0.

Definition at line 61 of file SDL_bits.h.

References SDL_FORCE_INLINE.

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